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更好的方式吗?
最直接的翻译是使用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.
解决这个问题的最简单方法是使用@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使这个有效.
| 归档时间: |
|
| 查看次数: |
375 次 |
| 最近记录: |