You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:39:03