这有效:
{-# LANGUAGE OverloadedStrings #-}
myFunc :: Text -> String
myFunc "" = "nothing"
myFunc other = "something!"
但是,如果没有
OverloadedStrings
扩展名,""
的类型为String
,因此无法编译。模式中不允许使用myFunc (pack "")
之类的功能。Haskell Bytestrings: How to pattern match?包含一些应该起作用的建议,但是在这种情况下,我想知道它是否与
OverloadedStrings
一起使用是否可以使用更好的方法有什么特别之处? 最佳答案
最直接的翻译是ViewPatterns
{-# LANGUAGE ViewPatterns #-}
import qualified Data.Text as Txt
myFunc (Txt.unpack->"") = "nothing"
myFunc _other = "something!"
最佳翻译当然是针对您的实际用例,但当然是
myFunc txt | Txt.null txt = "nothing"
| otherwise = "something!"
您也可以发疯,组成一个模式同义词:
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
pattern T :: String -> Txt.Text
pattern T str <- (Txt.unpack -> str)
where T = Txt.pack
然后
myFunc (T"") = "nothing"
myFunc _other = "something"
可以说
OverloadedStrings
是比ViewPatterns
更合理的扩展,并且肯定比PatternSynonyms
更精明。