如何在不使用OverloadedStrings的情况下对文本进行模式匹配?

时间:2016-09-04 17:38:09

标签: string haskell pattern-matching

这有效:

{-# LANGUAGE OverloadedStrings #-}
myFunc :: Text -> String
myFunc ""    = "nothing"
myFunc other = "something!"

但是,如果没有OverloadedStrings扩展名,""的类型为String,那么它就不会编译。模式中不允许使用myFunc (pack "")之类的函数。

Haskell Bytestrings: How to pattern match?包含一些应该有用的建议,但是在这种情况下,我想知道它是否与OverloadedStrings一起使用可以提供更好的方法有什么特别之处?< / p>

2 个答案:

答案 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"

可以说,OverloadedStringsViewPatterns更加明智,而且肯定比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来提高效率。