有人能解释一下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
是第二个参数)。由于这个错误,您的累加器在foldl
中从1
开始,而不是从0
开始。如果您将列表更改为["a", "b", "c", "d", "e"]
,那么您将在foldl
示例中得到一个很好的类型检查错误。 - MicroVirusfoldl (\_ acc -> acc + 1) 0 [0,0,0,0]
,也许您就能看到您的错误。 - pdexter