Haskell 如何让它变得更好&引用;也许是“布尔”;不';看起来不太好
首先,我是Haskell的新手,所以如果我问了一些愚蠢的问题,请告诉我如何才能做得更好。谢谢:) 我的任务是获得符合特定条件的字符串列表。如果没有符合条件的字符串,我希望计算为Haskell 如何让它变得更好&引用;也许是“布尔”;不';看起来不太好,haskell,monads,maybe,Haskell,Monads,Maybe,首先,我是Haskell的新手,所以如果我问了一些愚蠢的问题,请告诉我如何才能做得更好。谢谢:) 我的任务是获得符合特定条件的字符串列表。如果没有符合条件的字符串,我希望计算为Nothing。所以我写了两个函数: isSpecialLine::String->String->maybool isSpecialLine t s=Just$(“[”++t++“:”`isPrefixOf`s)和&(“]::”`isuffixof`s) getLinesWith::String->String->May
Nothing
。所以我写了两个函数:
isSpecialLine::String->String->maybool
isSpecialLine t s=Just$(“[”++t++“:”`isPrefixOf`s)和&(“]::”`isuffixof`s)
getLinesWith::String->String->Maybe[String]
getLinesWith t=filterM(isSpecialLine t)。线
这个代码很有效,但我发现可能Bool
看起来有点奇怪。嘿,它是二进制的!它总是True
或False
,因此isSpecialLine
的值总是刚好为True
或刚好为False
。在我的情况下,它永远不会是什么都不是
但如果我将isSpecialLine
输出类型更改为Bool
,则会出现以下问题:filterM
预期可能是Bool
而不是Bool
好的,我这样做:
getLinesWith::String->String->Maybe[String]
getLinesWith t=filterM(仅$isSpecialLine t)。线
现在编译器抱怨类型不匹配:Maybe(String->Bool)
与预期的String->Maybe Bool
不匹配。好吧,很合理。因此,我:
getLinesWith::String->String->Maybe[String]
getLinesWith t=仅$filter(isSpecialLine t)。线
同样,类型不匹配,这次
可能(String->[String])
不是String->Maybe[String]
。将[String]
包装到Maybe
monad的正确语法是什么?是一个特殊的从不产生任何东西
,因此这是一个很好的提示,Maybe
可能对它也没有意义
isSpecialLine :: String -> String -> Bool
isSpecialLine t s = (("[" ++ t ++ ":") `isPrefixOf` s) && ("]::" `isSuffixOf` s)
getLinesWith :: String -> String -> [String]
getLinesWith t = filter (isSpecialLine t) . lines
在我看来,这里不需要filterM
。您可以改为使用:
isSpecialLine::String->String->Bool
isSpecialLine t s=isPrefixOf(“[”++t++“:”)s&&isuffixof“]::”s
getLinesWith::String->String->[String]
getLinesWith t=过滤器(isSpecialLine t)。行
实际上,这将返回一个字符串列表,其中与isSpecialLine
过滤器匹配的每个字符串都将被保留。而不是像这样使用Maybe
和从getLinesWith展开数据
getLinesWith::String->String->Maybe[String]
...
getDate::String->String->UTCTime
getDate t s=
时间字符串
. 过滤器(/=“”)
. 介于克隆之间
. 可能“:01-01-1971:“头$getLinesWith t s
我在没有可能的情况下完成了外观更好(我希望如此)的解决方案:
getLinesWith::String->String->[String]
...
getDate::String->String->UTCTime
getDate t s
|空日期=timeFromString“01-01-1971”
|否则=timeFromString
. 过滤器(/=“”)
. 介于克隆之间
. 总目$日期
其中date=getLinesWith t s
实际上,当GHC抱怨头部[]
时,所有围绕的舞蹈都开始了。
谢谢大家的意见 我想你首先不需要也许。可能
通常用于非总计函数(例如一些非感官输入)。当然,这是getLinesWith
的第一个版本。但是我想得到可能是[String]
,而不是[String]
。在这种情况下该怎么办?@Pnatone887:在什么条件下,getLinesWith
返回Nothing
?如果没有符合条件的行,它应该返回Nothing
。@Pantone877您认为Nothing
和Just[]之间有什么区别吗
?@Pantone877:通常,可能
可以被视为类型级别上的1+
:我们构造一个额外的值。但通常只有这样做才有意义,若我们需要一个额外的值,来表示不能用n个其他值来表示的东西。我记得Tom Schrijvers关于这一点的一次谈话,但不知怎么的,我无法立即找到它。如果您使用date=getLinesWith t s++[“01-01-1971”]
(或者任何字符串将被处理为“01-01-1971”
),您可以保证date
是一个非空列表,并且head
可以安全使用。好极了,@chepner!那就更优雅了。我非常感激!
isSpecialLine :: String -> String -> Bool
isSpecialLine t s = isPrefixOf ("[" ++ t ++ ":") s && isSuffixOf "]::" s
getLinesWith :: String -> String -> [String]
getLinesWith t = filter (isSpecialLine t) . lines