【发布时间】:2016-06-06 13:48:23
【问题描述】:
谁能解释foldl 的工作原理?
我知道,例如,foldr (-) 0 [1,2,3] 产生 (1 - (2 - (3 - 0))),而 foldl (-) 0 [1,2,3] 产生 (((0 - 1) - 2) - 3),但我还有一些问题:
第一个示例(带有 foldr/foldl 的列表的长度):
foldr (\_ acc -> acc + 1) 0 [1,2,3,4,5]按预期生成 5。foldl (\_ acc -> acc + 1) 0 [1,2,3,4,5]生成 6。:|foldl (\_ acc -> acc + 1) 0 [2]生成 3 . :|
foldl 对这些给定的例子有何反应?第二个例子:
foldr (:) [] [1,2,3,4]产生 [1,2,3,4] - 不用担心,但foldl (:) [] [1,2,3,4]给我一个错误:Occurs check: cannot construct the infinite type: a ~ [a]
foldl 有什么问题?
【问题讨论】:
-
对于
foldl,您需要在acc和_之间切换参数顺序,因为foldr在逻辑上将初始参数放在序列的末尾,而foldl将它放在逻辑上在一开始。这意味着累加器是foldl的折叠函数的第一个 (!) 参数(以及foldr的第二个参数)。由于这个错误,您的累加器“开始”在1为foldl而不是0。例如,如果您将列表更改为["a", "b", "c", "d", "e"],那么您将在foldl示例中得到一个很好的类型检查错误。 -
如果您尝试
foldl (\_ acc -> acc + 1) 0 [0,0,0,0],那么您可能会看到您的错误。 -
谢谢@MicroVirus!
-
@MicroVirus 您应该考虑将该评论作为答案!
-
@pdexter 是的,我的措辞可能有点令人困惑,但我的意思是“元素”
1。我在一条评论中将所有内容都扼杀了,所以这不是一个完整的答案。随意写一个完整的答案;适合所有人。
标签: haskell functional-programming fold foldleft