Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何让它变得更好&引用;也许是“布尔”;不';看起来不太好_Haskell_Monads_Maybe - Fatal编程技术网

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

首先,我是Haskell的新手,所以如果我问了一些愚蠢的问题,请告诉我如何才能做得更好。谢谢:)

我的任务是获得符合特定条件的字符串列表。如果没有符合条件的字符串,我希望计算为
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