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

Haskell中foldr实现length函数的lambda参数含义确认

你的理解大部分正确,仅第二点关于n参数的描述可以更精准:

  • 第一点完全正确:lambda的第一个参数就是foldr当前遍历到的列表元素,因为计算列表长度不需要用到元素本身的值,所以用下划线_标记为忽略变量,符合Haskell的编码规范。
  • 第二点可以调整为:第二个参数n是当前元素右侧的子列表经过foldr计算得到的长度结果。foldr是右折叠,求值顺序从列表最右端开始,你理解的“上一次迭代的返回值”如果是从右往左的求值视角来看也成立,不过用“右侧子列表的折叠结果”描述会更准确,不容易和左折叠foldl的迭代逻辑混淆。

可以参考len [1,2,3]的完整展开过程辅助理解:

foldr (\_ n -> n + 1) 0 [1,2,3]
-- 逐层展开foldr
= (\_ n -> n + 1) 1 (foldr (\_ n -> n + 1) 0 [2,3])
= (\_ n -> n + 1) 1 ((\_ n -> n + 1) 2 (foldr (\_ n -> n + 1) 0 [3]))
= (\_ n -> n + 1) 1 ((\_ n -> n + 1) 2 ((\_ n -> n + 1) 3 0))
-- 从最内层开始求值
= (\_ n -> n + 1) 1 ((\_ n -> n + 1) 2 (0 + 1))
= (\_ n -> n + 1) 1 (1 + 1)
= 2 + 1
= 3

内容的提问来源于stack exchange,提问作者Pastilhas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:36:03