【发布时间】:2015-01-08 17:02:42
【问题描述】:
我一直试图围绕 foldr 和 foldl 思考很长一段时间,我决定下面的问题应该为我解决。假设您将以下列表 [1,2,3] 传递给以下四个函数:
a = foldl (\xs y -> 10*xs -y) 0
b = foldl (\xs y -> y - 10 * xs) 0
c = foldr (\y xs -> y - 10 * xs) 0
d = foldr (\y xs -> 10 * xs -y) 0
结果将分别为 -123、83、281 和 -321。
为什么会这样?我知道当您将 [1,2,3,4] 传递给定义为的函数时
f = foldl (xs x -> xs ++ [f x]) []
它被扩展为 ((([] ++ [1]) ++ [2]) ++ [3]) ++ [4]
同样,上述函数 a、b、c 和 d 扩展为什么?
【问题讨论】:
-
您是否搜索过其他与 foldr/foldl 相关的问题?他们中的许多人展示了扩展并且有很好的解释。您也可以尝试自己进行替换,用它们的定义替换对 fold 的递归调用,以便对正在发生的事情有一个很好的直觉。
-
我确实搜索了一些解释,但我仍然无法理解它们。他们都没有成功地向我展示如何将 foldl 和 foldr 调用替换为上述表达式。我不确定如何自己进行替换,这就是我问这个问题的原因。或者你的意思是我看看 foldr 和 foldl 是如何递归定义的,并分别用 a、b、c 和 d 遍历它们。听起来我在寻找捷径很麻烦,但我想如果没有其他方法......
-
我会确保在我弄清楚答案后发表评论
-
我还没有,我去看看:)