【发布时间】:2021-04-15 03:31:08
【问题描述】:
我有两个功能。如果列表的所有元素都为零,则第一个结果为 true
allZero :: [Int] -> Bool
allZero [] = False
allZero [0] = True
allZero (x:xs)
| x == 0 && allZero xs = True
|otherwise = False
如果列表的至少一个元素为零,则第二个函数返回 true
oneZero :: [Int] -> Bool
oneZero [] = False
oneZero (x:xs)
| x == 0 = True
| otherwise = oneZero xs
也许还有另一种方法可以解决这个问题。例如使用地图或文件夹? 谢谢
【问题讨论】:
-
你尝试了什么?可以用
foldr来实现any和all吗? -
@WillemVanOnsem 我不太明白 foldr 是如何工作的。我了解地图的工作原理,但我不知道如何应用它。
-
allZero [] = False令人惊讶。你确定在这种情况下不想要True,正如你的非正式规范所暗示的那样吗? -
chi 上面的评论暗示的是 allZero 可以被视为 noNonZeros 并且 [] 中肯定没有零,所以它应该返回 True 。这是通常的做法。
-
allZero (x:xs) = x == 0 && allZero xs。oneZero (x:xs) = x == 0 || oneZero xs。allZero = all . map (== 0)。oneZero = any . map (== 0)。all == foldr (&&) True。any == foldr (||) False。 (这不是一个完整的答案,因为它没有单词,因此它被留下作为评论。)
标签: function haskell boolean fold