函数式编程:Curry & Fold——词源是什么?

Functional programming: Curry & Fold - what are the etymologies?

  1. Curry & Fold - 编程意义上的词源是什么? 我看不出这些 homonyms 的任何英文含义与这些术语的功能有什么关系。

  2. 如果您必须将它们重命名为更明显的名称 - 您会怎么做?

Curry 是 Haskell Curry 的姓氏,他是 20 世纪杰出的逻辑学家 after whom Haskell got its name

而"folding"仅仅是因为fold运算符形象地表示折叠,就像一手牌可以折叠成单张牌一样。将 foldr (+) 0 [1,2,3] == 6 视为一手牌 1、2 和 3 折叠成一张牌 6.

"reducing"这个词也有折叠的意思,可以用类似的比喻来说明。

当然,Haskell 甚至比最虚张声势和最幸运的扑克游戏更神奇,因此函数式编程中的弃牌实际上可以产生一副纸牌,比弃牌时的手牌更多,或者卡片可以折叠成猫等:foldr (\i, acc -> [show i,show i,show i] ++ acc) [] [1,2,3] == ["1","1","1","2","2","2","3","3","3"]。因此,最初的折叠最终演变成一个非常通用的运算符,可以产生 map 以及 filter 等,所以不要对扑克比较和词源太过痴迷。


至于给他们起什么名字:给死者重新命名可能不是最合乎道德的做法。可怜的家伙如此成功,他的两个名字都用于大事,然后你想剥夺他死后的快乐并给他改名?除非可能是 Newton Watt Scoville 或 Kelvin Celsius Ângström,否则我真的不会尝试重命名。

但是,如果您的意思是重命名编程概念:在我看来,可以改用名称 "ricing" 来引用它。但库里先生可能仍会感到害怕。

弃牌实际上可以重命名为诈唬,如果你不满足 the multitude of presently available names for it — 感谢 som-snytt 的建设性想法。

我认为 "fold" 这个词主要来自 "fold" 这个词在像 "to fold into..." 这样的短语中的使用,这是厨师最常用的一个词,我相信(我看了很多烹饪节目……)。我们在函数式编程的上下文中使用它,因为我们说,例如,对于列表,列表的头部是 "folded into" 折叠尾部的结果。例如,函数 foldr 是关于如何 "cook" 列表的 "recipe",如果您愿意,该方法的一部分是 "fold this into that"。

我在 Internet 上找到的关于 "folding" 的最古老的函数式编程参考文献是 this 报告,该报告于 1985 年由剑桥大学发布,其中是这样说的:

The function gather applies a function of two arguments “between” each element of a list and a terminal value. [...] This function is also known as reduce or fold in other languages.

很明显 "fold" 这个词在 30 年前至少有点普遍!