为什么Haskell中foldr与foldl的lambda参数顺序看似互换?
Haskell foldr与foldl的lambda参数顺序差异解答
本质是两个折叠函数的标准定义不同
foldr和foldl的折叠操作函数参数顺序本身就是不同的,是为了适配各自的折叠方向逻辑做的设计,并非参数含义被折叠方向改变:
- 右折叠
foldr的折叠函数参数固定为 当前元素在前,累加器在后
右折叠的运算逻辑是从列表右端开始,将当前元素和右侧已完成的累加结果做运算,展开式符合右结合规则。比如foldr f init [a,b,c]的等效展开为f a (f b (f c init)),其中f的第一个参数始终是当前遍历的列表元素,第二个参数是已经计算好的右侧累加值,对应你给出的elem'实现里的lambda参数顺序\x acc -> ...。 - 左折叠
foldl的折叠函数参数固定为 累加器在前,当前元素在后
左折叠的运算逻辑是从列表左端开始,将已经计算好的左侧累加结果和当前元素做运算,展开式符合左结合规则。比如foldl f init [a,b,c]的等效展开为f (f (f init a) b) c,其中f的第一个参数始终是已经计算好的左侧累加值,第二个参数是当前遍历的列表元素,对应你给出的reverse'实现里的lambda参数顺序\acc x -> ...。
记忆技巧
可以通过展开式的括号位置快速区分参数顺序:
foldr的括号靠右侧,当前元素在括号外、累加值在括号内,所以元素在前、累加器在后foldl的括号靠左侧,累加值在括号内、当前元素在括号外,所以累加器在前、元素在后
内容的提问来源于stack exchange,提问作者Chaos_Is_Harmony
相关产品推荐
相关产品推荐

