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
相关产品推荐
相关产品推荐

