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

Xav*_*hay 3 string haskell pattern-matching

这有效:

{-# LANGUAGE OverloadedStrings #-}
myFunc :: Text -> String
myFunc ""    = "nothing"
myFunc other = "something!"
Run Code Online (Sandbox Code Playgroud)

OverloadedStrings但是,如果没有扩展名,""则为类型,String因此无法编译.myFunc (pack "")在模式中不允许使用类似的函数.

Haskell Bytestrings:如何模式匹配?包含一些应该有用的建议,但是在这种情况下,我想知道是否有一些特殊的事实,它可以使用OverloadedStrings更好的方式吗?

lef*_*out 9

直接的翻译是使用ViewPatterns

{-# LANGUAGE ViewPatterns #-}
import qualified Data.Text as Txt
myFunc (Txt.unpack->"") = "nothing"
myFunc _other = "something!"
Run Code Online (Sandbox Code Playgroud)

当然,最好的翻译虽然可能对您的实际用例过于具体

myFunc txt | Txt.null txt  = "nothing"
           | otherwise     = "something!"
Run Code Online (Sandbox Code Playgroud)

你也可以疯了,组成一个模式同义词:

{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
pattern T :: String -> Txt.Text
pattern T str <- (Txt.unpack -> str)
 where T = Txt.pack
Run Code Online (Sandbox Code Playgroud)

然后

myFunc (T"") = "nothing"
myFunc _other = "something"
Run Code Online (Sandbox Code Playgroud)

可以说,这OverloadedStrings是一个更健全的延伸ViewPatterns,而且肯定比更健全PatternSynonyms.


eps*_*lbe 6

解决这个问题的最简单方法是使用@melpomene建议的保护或案例表达.

testfunc :: Text -> String
testfunc s | s == pack "" = "nothing"
           | otherwise    = "someting"

testfunc' :: Text -> String
testfunc' s = case unpack s of
                "" -> "nothing"
                _  -> "something"
Run Code Online (Sandbox Code Playgroud)

LANGUAGE OverloadedStrings使用IsString类型类的内部工作方式,如果我没记错的话,我想它也依赖于INLINING使这个有效.