【问题标题】:Implement the functions using map and foldr, haskell使用map和foldr、haskell实现功能
【发布时间】: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 来实现anyall 吗?
  • @WillemVanOnsem 我不太明白 foldr 是如何工作的。我了解地图的工作原理,但我不知道如何应用它。
  • allZero [] = False 令人惊讶。你确定在这种情况下不想要True,正如你的非正式规范所暗示的那样吗?
  • chi 上面的评论暗示的是 allZero 可以被视为 noNonZeros 并且 [] 中肯定没有零,所以它应该返回 True 。这是通常的做法。
  • allZero (x:xs) = x == 0 && allZero xsoneZero (x:xs) = x == 0 || oneZero xsallZero = all . map (== 0)oneZero = any . map (== 0)all == foldr (&&) Trueany == foldr (||) False (这不是一个完整的答案,因为它没有单词,因此它被留下作为评论。)

标签: function haskell boolean fold


【解决方案1】:

foldr 函数是这样工作的:

假设,您有列表[1, 2, 3]。让我们将此列表写为(:) 1 ((:) 2 ((:) 3 [])),其中每个元素的类型为a。函数foldr 采用a -> b -> b 类型的函数fb 类型的起始元素z,只需将[] 替换为z:f。所以,foldr f z ((:) 1 ((:) 2 ((:) 3 []))) == f 1 (f 2 (f 3 z))

所以,你可以这样定义你的函数:

allZero = foldr (\x -> x == 0 &&) True

oneZero = foldr (\x -> x == 0 ||) False

【讨论】:

  • > :t foldr (\x -> x == 0 &&) True 给出错误。 :)
【解决方案2】:

foldr基本上是把你的防御当成它的折叠功能:

allZero = foldr (\x acc -> x == 0 && acc) True

acc(对于 accumulator)是递归调用的已计算值。由于是右关联的,列表中的第一个非零值会使折叠函数对列表其余部分的评估短路。

(注意allZero [] == True 按照惯例。“假设”是allZero xs 为真,有非零元素形式的证据来证伪假设。列表中没有元素,没有证据可以反驳假设。)

我把它作为一个练习来调整它来计算oneZero

【讨论】:

  • 我不确定我是否将其称为“约定”。这是我们希望逻辑具有的一些明显有用的属性的必要结论:math.stackexchange.com/questions/426051/…
  • re "convention",这是allZeroes (a ++ b) = allZeroes a && allZeroes b 因此allZeroes a = allZeroes (a ++ []) = allZeroes a && allZeroes []True&& 的标识元素的结果。 (另外,如果它已经计算过了,就没有短路。:))
  • 我认为allZeros 是同态因为 allZeroes [] 被定义为True,而不是相反,但是是的,“约定”这不是最好的表达方式。
猜你喜欢
  • 2016-09-04
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多