语言 |
左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[2]
|
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[3]
|
Elm
|
List.foldl(Fun, Accumulator, List)
|
List.foldr(Fun, Accumulator, List)
|
|
|
|
参见List API[4]
|
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"[5]
|
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 [6]和reduce [7]。还有Result.fold(onSuccess, onFailure) [8],它归约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 [9]
|
|
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[10]。参见在线的array_reduce文档[11]。
|
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中[12]。
|
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语法意图重组常用来解释折叠运算的左或右倾斜树[13],已经被重释义为一个顶级多米诺骨牌的例证[14]。来自通用Scala语法机制的冒号,凭借显见的中缀算子,被调用为一个方法在左操作数上,具有右操作数作为一个实际参数传递,或反之如果这个算子的最后字符是冒号,这里是对称应用的。
Scala还有使用方法list.fold(z)(op) 的树状折叠特征[15]。
|
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()* [16]
fold-left(
$seq as item()*,
$zero as item()*,
$f as function(item()*, item()) as item()*) as item()* [17]
|
array:fold-right(
$array as array(*),
$zero as item()*,
$f as function(item()*, item()*) as item()*) as item()* [18]
fold-right(
$seq as item()*,
$zero as item()*,
$f as function(item(), item()*) as item()*) as item()* [19]
|
|
|
|
在XPath 3.1中由于历史原因,array 和sequence 类型是不相容的 -- 因此需要分离给array 和给sequence 的fold 函数。在签名上的不同是由于array 项目的值可以是sequence ,但是XPath没有sequence 的sequence 。
|
Xtend
|
iterable.fold(initval,[func])
|
|
iterable.reduce[func]
|
|
|
|