9

通常称为的高阶函数reduce在各种语言中有很多同义词。

在我的脑海中,我能想到:

  • foldr, foldl(又名右折和左折)(Haskell)
  • inject(Smalltalk、Ruby、Groovy)
  • Aggregate(LINQ)
  • accumulate维基百科
  • compress维基百科

是否有该函数所有不同名称的完整列表?如果没有,让我们在这里做一个。知道会很有用。

我对从每种语言中获取库函数名称不太感兴趣,我正在寻找更多的口语,“它如何在句子中使用”类型参考。

4

6 回答 6

7

您可能会注意到,一般来说,这个概念被称为catamorphism来自 wikipedia,或者还有可爱的文章使用香蕉、镜头、信封和铁丝网进行函数式编程

于 2012-06-04T02:17:57.477 回答
6

好吧,到目前为止,总清单似乎是:

  • catamorphism(通用术语,见 Kristopher 的帖子
  • reduce(Python、Clojure、Common Lisp、Ruby)
  • reduction(APL)
  • foldr, foldl(又名右折和左折)(Haskell,Scheme)
  • inject(Smalltalk、Ruby、Groovy)
  • #inject:into(短暂聊天)
  • Aggregate(LINQ)
  • accumulate维基百科
  • compress维基百科
  • insertion(FP)
  • Insert(J)

感谢大家的帮助,如果以后有人提供更好的列表,我将确保接受该列表!

于 2012-06-06T18:12:13.750 回答
5

来自《关于 fold 的普遍性和表现力的教程》:

折叠运算符起源于递归理论 (Kleene, 1952),而在编程语言中使用折叠作为中心概念可以追溯到 APL 的归约运算符 (Iverson, 1962),然后是 FP的插入运算符(巴克斯,1978 年)。

于 2012-06-04T12:38:22.843 回答
2

Scala 称它们为foldLeftfoldRight. 它们也由符号/:和表示:\

这些有一些不带种子的变体。它们被称为reduceLeftreduceRight。还有一些变体reduce*不会在空序列上引发错误。它们被称为reduceLeftOptionreduceRightOption

有一些变体,无论哪种方式,遍历的方向都无关紧要。它们被称为foldand reduce; 第一个有种子,第二个没有。

我本可以把它放在一张漂亮的桌子上。可惜stackoverflow不允许这样做。

于 2012-06-09T09:59:19.657 回答
2

还有几个:

  • foldr, foldl(方案)
  • reduce(Python、Clojure、Common Lisp)
  • #inject:into:(短暂聊天)
于 2012-06-04T02:12:26.720 回答
0

另一个

  • foldl'(Haskell,类似于 foldl,但适用于更长的列表)

(希望你的反讽检测器已经打开......)

于 2013-03-14T14:16:36.443 回答