这有效:

{-# 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更精明。

09-13 07:28