foldl 是如何工作的?
How does foldl work?
谁能解释一下 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 有什么问题?
在 foldr
中,累加器是您要折叠的函数的第二个参数,但在 foldl
中,累加器是第一个参数。如果您仔细查看问题的介绍性段落,您可以自己解决这个问题...
“第一个示例”代码具有误导性,因为 acc
参数(其名称暗示它应该是一个累加器)始终是 lambda 的第二个参数,而对于 [=13 它应该是第一个参数=].另外令人困惑的是,示例列表元素的类型和值反映了累加器值的类型和值……正如评论中提到的,使用其他值会更好,使用其他类型会更好!
对于“第二个例子”,你会得到一个类型错误,因为你的参数被交换了(而且你不能有一个其元素是其自身列表的列表)。手动交换参数顺序:
foldl (\xs x -> x:xs)
否则使用flip
,为此设计的库函数:
foldl (flip (:))
请注意,foldl
情况的结果应该是一个反向列表(不是复制的列表),因为 foldl
从 foldr
.[=20 的相反方向迭代=]
谁能解释一下 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 有什么问题?
在 foldr
中,累加器是您要折叠的函数的第二个参数,但在 foldl
中,累加器是第一个参数。如果您仔细查看问题的介绍性段落,您可以自己解决这个问题...
“第一个示例”代码具有误导性,因为 acc
参数(其名称暗示它应该是一个累加器)始终是 lambda 的第二个参数,而对于 [=13 它应该是第一个参数=].另外令人困惑的是,示例列表元素的类型和值反映了累加器值的类型和值……正如评论中提到的,使用其他值会更好,使用其他类型会更好!
对于“第二个例子”,你会得到一个类型错误,因为你的参数被交换了(而且你不能有一个其元素是其自身列表的列表)。手动交换参数顺序:
foldl (\xs x -> x:xs)
否则使用flip
,为此设计的库函数:
foldl (flip (:))
请注意,foldl
情况的结果应该是一个反向列表(不是复制的列表),因为 foldl
从 foldr
.[=20 的相反方向迭代=]