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

如何在无可变特性的编程语言中为迭代器编写fold方法?

无可变变量下实现折叠(Fold)的思路

你完全不用纠结可变累加器的问题——纯函数式编程里的折叠操作,从设计之初就不需要依赖可变变量,核心逻辑是通过递归传递不可变的累加状态来完成聚合。

核心原理

每一次迭代时,我们不会修改现有的累加器,而是用当前累加器和当前元素,通过聚合函数生成一个全新的不可变累加值,再把这个新值传入下一轮迭代(递归调用)。整个过程中所有变量都是只读的,没有任何修改操作。

伪代码示例

比如实现一个求和的折叠逻辑:

func fold_left(iterable, initial_acc, combine):
    if iterable is empty:
        return initial_acc
    else:
        first = iterable.first()
        rest = iterable.rest()
        new_acc = combine(initial_acc, first)
        return fold_left(rest, new_acc, combine)

调用时,比如对[1,2,3]求和,初始累加值传0:

  • 第一次:用0和1生成新累加值1,传入下一轮处理[2,3]
  • 第二次:用1和2生成新累加值3,传入下一轮处理[3]
  • 第三次:用3和3生成新累加值6,传入下一轮处理空列表,返回6

全程没有修改任何变量,每一步的累加值都是全新的。

实际语言示例

Haskell 实现

Haskell里的foldl就是标准的纯函数式折叠:

-- 定义求和函数,用foldl实现
sumList :: [Int] -> Int
sumList = foldl (\acc x -> acc + x) 0

-- 调用示例
-- sumList [1,2,3] 结果为6

这里的acc每一步都是新的不可变值,不存在修改操作。

Scala 实现

Scala的foldLeft同样遵循纯函数式逻辑:

val numbers = List(1, 2, 3)
val total = numbers.foldLeft(0)((acc, num) => acc + num)
// total 的值为6

和你提到的modify_all的关联

你说的modify_all本质是映射(Map)操作,它生成一个新的可迭代对象;而折叠是聚合操作,生成一个单一的聚合值。两者的核心都是基于不可变数据——要么生成新的集合,要么生成新的累加状态,全程不需要任何可变特性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:12:09