Pan*_*877 3 monads haskell maybe
首先,我是Haskell的新手,所以如果我问一些愚蠢的问题,请告诉我如何做得更好。谢谢 :)
我的任务是获取符合特定条件的字符串列表。如果没有符合条件的字符串,我想评估为Nothing。所以我写了两个函数:
isSpecialLine :: String -> String -> Maybe Bool
isSpecialLine t s = Just $ (("[" ++ t ++ ":") `isPrefixOf` s) && ("]::" `isSuffixOf` s)
getLinesWith :: String -> String -> Maybe [String]
getLinesWith t = filterM (isSpecialLine t) . lines
Run Code Online (Sandbox Code Playgroud)
这段代码有效,但是我发现这Maybe Bool看起来有点奇怪。嘿,是二进制文件!它始终为Trueor False,因此value isSpecialLine始终为Just Trueor Just False。就Nothing我而言,绝对不可能!
但是,如果我将isSpecialLine输出类型更改为Bool,则会出现以下问题:filterMExpects Maybe Bool而不是Bool。
好的,我这样做:
getLinesWith :: String -> String -> Maybe [String]
getLinesWith t = filterM (Just $ isSpecialLine t) . lines
Run Code Online (Sandbox Code Playgroud)
现在,编译器抱怨类型Maybe (String -> Bool)不匹配:与期望值不匹配String -> Maybe Bool。好的,很合理。所以我:
getLinesWith :: String -> String -> Maybe [String]
getLinesWith t = Just $ filter (isSpecialLine t) . lines
Run Code Online (Sandbox Code Playgroud)
再次键入不匹配,这次Maybe (String -> [String])不是String -> Maybe [String]。包装[String]为Maybemonad 的正确语法是什么?
isSpecialLine从不产生Nothing,因此这是一个很好的提示,Maybe也可能没有任何意义。
isSpecialLine :: String -> String -> Bool
isSpecialLine t s = (("[" ++ t ++ ":") `isPrefixOf` s) && ("]::" `isSuffixOf` s)
getLinesWith :: String -> String -> [String]
getLinesWith t = filter (isSpecialLine t) . lines
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |