Fold (高阶函数)
在各种语言中

| 语言 | 左fold | 右fold | 无初始值左fold | 无初始值右fold | Unfold | 注释 |
| --- | --- | --- | --- | --- | --- | --- |
| APL | func⍨/⌽initval,vector | func/vector,initval | func⍨/⌽vector | func/vector |  |  |
| C# 3.0 | ienum.Aggregate(initval, func) | ienum.Reverse().Aggregate(initval, func) | ienum.Aggregate(func) | ienum.Reverse().Aggregate(func) |  | Aggregate是扩展方法（英语：）  ienum是IEnumerable<T> 在所有的.NET语言中都类似 |
| C++ | std::accumulate(begin, end, initval, func) | std::accumulate(rbegin, rend, initval, func) |  |  |  | 在头文件 <numeric>中 begin, end, rbegin, rend是迭代器 func可以是一个函数指针或函数对象 |
| C++17 | (initval op ... op pack) | (pack op ... op initval) | (... op pack) | (pack op ...) |  | Fold表达式（只用于变元函数模板）：op是二元算子（两个op必须相同，比如(std::cout << ... << args))， pack是未展开的参数包。 |
| CFML（英语：） | obj.reduce(func,initial) |  | obj.reduce(func) |  |  | 这里的func接受为实际参数的是前面运算的结果（或在第一次迭代上的initial值）；当前项；当前项的索引或键；和到obj的引用。 |
| Clojure | (reduce func initval list) | (reduce func initval (reverse list')) | (reduce func list) | (reduce func" (reverse list)) |  | 参见clojure.core.reducers/fold |
| Common Lisp | (reduce func list :initial-value initval) | (reduce func list :from-end t :initial-value initval) | (reduce func list) | (reduce func list :from-end t) |  |  |
| Curl | {{TreeNode.default treeNode ...} .to-Iterator} | {{TreeNode.default treeNode ...} .reverse}.to-Iterator} | {for {treeNode.to-Iterator} do} | {for {{treeNode.reverse}.to-Iterator} do} |  | 还有DefaultListModel和HashTable实现to-Iterator |
| D | reduce!func(initval, list) | reduce!func(initval, list.reverse) | reduce!func(list) | reduce!func(list.reverse) |  | 在模块std.algorithm中 |
| Elixir | List.foldl(list, acc, fun) | List.foldr(list, acc, fun) |  |  |  | 样例用法见于documentation |
| Elm | List.foldl(Fun, Accumulator, List) | List.foldr(Fun, Accumulator, List) |  |  |  | 参见List API |
| Erlang | lists:foldl(Fun, Accumulator, List) | lists:foldr(Fun, Accumulator, List) |  |  |  |  |
| F# | Seq/List.fold func initval list | List.foldBack func list initval | Seq/List.reduce func list | List.reduceBack func list | Seq.unfold func initval |  |
| Gosu（英语：） | Iterable.fold(f(agg, e))Iterable.reduce(init, f(agg, e)) Iterable.partition(f(e))  |  |  |  |  | 都是在java的Iterable接口上的扩展方法（英语：），数组也支持。 |
| Groovy | list.inject(initval, func) | list.reverse().inject(initval, func) | list.inject(func) | list.reverse().inject(func) |  |  |
| Haskell | foldl func initval list | foldr func initval list | foldl1 func list | foldr1 func list | unfoldr func initval | 对于foldl，折叠函数接受参数的次序与foldr的次序相反。 |
| Haxe | Lambda.fold(iterable, func, initval) |  |  |  |  |  |
| J | verb~/|. initval,array | verb/ array,initval | verb~/|. array | verb/ array |  | u/y应用二元u于y的项目之间。参见"J Dictionary: Insert" |
| Java 8+ | stream.reduce(initval, func) |  | stream.reduce(func) |  |  |  |
| JavaScript 1.8 ECMAScript 5 | array.reduce(func, initval) | array.reduceRight(func, initval) | array.reduce(func) | array.reduceRight(func) |  |  |
| Julia | foldl(op, itr; [init]) | foldr(op, itr; [init]) | foldl(op, itr) | foldr(op, itr) |  |  |
| Kotlin | Iterable.fold(initval, func) | Iterable.foldRight(initval, func) | Iterable.reduce(func) | Iterable.reduceRight(func) |  | 其他搜集也支持fold和reduce。还有Result.fold(onSuccess, onFailure)，它归约Result<T>（要么成功要么失败）成onSuccess和onFailure的返回类型。 |
| LFE（英语：） | (lists:foldl func accum list) | (lists:foldr func accum list) |  |  |  |  |
| Logtalk（英语：） | fold_left(Closure, Initial, List, Result) | fold_right(Closure, Initial, List, Result) |  |  |  | meta标准库对象提供元谓词。缩写foldl和foldr也可以使用。 |
| Maple | foldl(func, initval, sequence) | foldr(func, initval, sequence) |  |  |  |  |
| Mathematica | Fold[func, initval, list] | Fold[func, initval, Reverse[list]] | Fold[func, list] | Fold[func, Reverse[list]] | NestWhileList[func,, initval, predicate] | 不带初始值的Fold在版本10.0和更高版本中支持。 |
| MATLAB | fold(@func, list, defaultVal) | fold(@func, flip(list), defaultVal) | fold(@func, list) | fold(@func, flip(list)) |  | 要求Symbolic Math Toolbox，从R2016b开始支持。 |
| Maxima | lreduce(func, list, initval) | rreduce(func, list, initval) | lreduce(func, list) | rreduce(func, list) |  |  |
| Mythryl | fold_left func initval list  vector::fold_left func initval vector | fold_right func initval list  vector::fold_right func initval vector |  |  |  | 提供的函数接受在元组中实际参数。 |
| OCaml | List.fold_left func initval list  Array.fold_left func initval array | List.fold_right func list initval  Array.fold_right func array initval |  |  | Base.Sequence.unfold ~init ~f  |  |
| Oz | {FoldL List Func InitVal} | {FoldR List Func InitVal} |  |  |  |  |
| PARI/GP（英语：） | fold( f, A ) |  |  |  |  |  |
| Perl | reduce block initval, list |  | reduce block list |  |  | 在List::Util模块中 |
| PHP | array_reduce(array, func, initval) | array_reduce(array_reverse(array), func, initval) | array_reduce(array, func) | array_reduce(array_reverse(array), func) |  | 在未提供initval的时候，使用了NULL，所以不是真正的foldl1。在PHP 5.3之前，initval只能是整数。func是一个callback。参见在线的array_reduce文档。 |
| Python 2.x | reduce(func, list, initval) | reduce(lambda x,y: func(y,x), reversed(list), initval) | reduce(func, list) | reduce(lambda x,y: func(y,x), reversed(list)) |  |  |
| Python 3.x | functools.reduce(func, list, initval) | functools.reduce(lambda x,y: func(y,x), reversed(list), initval) | functools.reduce(func, list) | functools.reduce(lambda x,y: func(y,x), reversed(list)) |  | 在模块functools中。 |
| R | Reduce(func, list, initval) | Reduce(func, list, initval, right=TRUE) | Reduce(func, list) | Reduce(func, list, right=TRUE) |  | R通过给Reduce函数的right和init实际参数，支持右折叠和有或没有初始值的左或右折叠。 |
| Ruby | enum.inject(initval, &block)  enum.reduce(initval, &block) | enum.reverse_each.inject(initval, &block)  enum.reverse_each.reduce(initval, &block) | enum.inject(&block)  enum.reduce(&block) | enum.reverse_each.inject(&block)  enum.reverse_each.reduce(&block) |  | 在Ruby 1.8.7+中，还可以传递表示一个函数而非块的一个符号。 enum是Enumeration  请注意这些右折叠的实现对于非交换律的&block是有误的（还有初始值放在错误的一侧）。 |
| Rust | iterator.fold(initval, func) | iterator.rev().fold(initval, func) |  |  |  |  |
| Scala | list.foldLeft(initval)(func) (initval /: list)(func) | list.foldRight(initval)(func) (list :\ initval)(func) | list.reduceLeft(func) | list.reduceRight(func) |  | Scala的符号式fold语法意图重组常用来解释折叠运算的左或右倾斜树，已经被重释义为一个顶级多米诺骨牌的例证。来自通用Scala语法机制的冒号，凭借显见的中缀算子，被调用为一个方法在左操作数上，具有右操作数作为一个实际参数传递，或反之如果这个算子的最后字符是冒号，这里是对称应用的。 Scala还有使用方法list.fold(z)(op)的树状折叠特征。 |
| Scheme R6RS | (fold-left func initval list)  (vector-fold func initval vector) | (fold-right func initval list)  (vector-fold-right func initval vector) | (reduce-left func defaultval list) | (reduce-right func defaultval list) |  | srfi/1 srfi/43 |
| Smalltalk | aCollection inject: aValue into: aBlock |  | aCollection reduce: aBlock |  |  | ANSI Smalltalk不定义#reduce: 但是很多实现定义了。 |
| Standard ML | foldl func initval list  Array.foldl func initval array | foldr func initval list  Array.foldr func initval array |  |  |  | 提供的函数接受在元组中的实际参数。对于foldl，折叠函数接受实际参数的次序同于foldr的次序。 |
| Swift | array.reduce(initval, func)  reduce(sequence, initval, func) | array.reverse().reduce(initval, func) |  |  |  |  |
| XPath 3.1 |  array:fold-left( $array as array(*), $zero as item()*, $f as function(item()*, item()*) as item()*) as item()* fold-left( $seq as item()*, $zero as item()*, $f as function(item()*, item()) as item()*) as item()*   |  array:fold-right( $array as array(*), $zero as item()*, $f asfunction(item()*, item()*) as item()*) as item()* fold-right( $seq as item()*, $zero as item()*, $f as function(item(), item()*) as item()*) as item()* |  |  |  | 在XPath 3.1中由于历史原因，array和sequence类型是不相容的 -- 因此需要分离给array和给sequence的fold函数。在签名上的不同是由于array项目的值可以是sequence，但是XPath没有sequence的sequence。   |
| Xtend（英语：） | iterable.fold(initval,[func]) |  | iterable.reduce[func] |  |  |  |