这有效:
{-# LANGUAGE OverloadedStrings #-}
myFunc :: Text -> String
myFunc "" = "nothing"
myFunc other = "something!"
但是,如果没有OverloadedStrings
扩展名,""
的类型为String
,那么它就不会编译。模式中不允许使用myFunc (pack "")
之类的函数。
Haskell Bytestrings: How to pattern match?包含一些应该有用的建议,但是在这种情况下,我想知道它是否与OverloadedStrings
一起使用可以提供更好的方法有什么特别之处?< / p>
答案 0 :(得分:9)
直接翻译最多的是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
更加明智。
答案 1 :(得分:6)
解决此问题的最简单方法是使用@melpomene建议的保护或案例表达。
testfunc :: Text -> String
testfunc s | s == pack "" = "nothing"
| otherwise = "someting"
testfunc' :: Text -> String
testfunc' s = case unpack s of
"" -> "nothing"
_ -> "something"
LANGUAGE OverloadedStrings
的内部工作原理使用IsString
类型类,如果我没记错的话,我想它也依赖于INLINING
来提高效率。