我试图在C ++中不想要lambda演算和lambda表达式之间的联系。
首先,在无类型的lambda演算中,我们没有像booleans或int或whatevr那样的“基本值”,所以一切都必须编码为函数,然后我们可以将任何术语应用于任何其他术语,这不是一旦它有一个类型系统,在C ++中就是这种情况。
此外,我已经看到lambda表达式要么在函数指针中转换(当它们没有捕获任何东西时),也要转换为functors(只包含函数的类)。
所以我想知道,“lambda表达式”只是匿名函数的一个奇特的名称,因此它类似于lambda演算(在某种意义上,lambda表达式中的术语可以被视为未命名的函数),还是有更多呢?
提前致谢。
答案 0 :(得分:8)
Alonzo Church不仅仅发明了lambda 微积分 - 他想出了 关于函数的有用符号,lambda符号,他在1941年关于lambda演算的书中的第5-7页描述了它[1]:
以自然数的函数理论为例, 考虑表达式。如果我们说“大于1,000,”我们发表的声明取决于 x 并且实际上没有任何意义,除非 x 被确定为某些特定的自然数。另一方面,如果我们说“是一个原始的递归函数,”我们做出一个明确的陈述,其含义绝不取决于变量 x 的确定(所以在这种情况下, x 扮演明显或绑定变量的角色。 … 我们应该 此后通过使用... 作为相应函数的表示进行区分....
在20世纪50年代,当John McCarthy开发Lisp时,他采用了Church的符号。他1960年的论文描述了Lisp:
函数和表单。在数学中 - 通常在数学逻辑之外 - 不精确地使用“函数”这个词并将其应用于诸如y ^ 2 + x的形式。因为我们稍后将使用表达式来计算函数,所以我们需要区分函数和表单以及表达这种区别的符号。教会[引用教会[2]]给出了这种区别和用于描述它的符号,我们从中略有偏离。
(他后来说“要使用函数作为参数,需要一个函数符号,并且使用教会的lambda符号似乎很自然。我不理解本书的其余部分,所以我不是试图实现他更常用的定义函数的机制。“[3]然而,Lisp出乎意料地接近实现lambda演算的一种形式。)
将匿名函数纳入C ++的建议至少可以追溯到1988年[4],仅在C ++发明9年后,作者似乎已经清楚地了解了Lisp的用法并采用了这个名称。使其成为C ++ 11标准[5]的提案,以及导致它的工作(例如[6],[7])简单地说(例如)“该术语起源于函数式编程和lambda演算,其中lambda抽象定义了一个未命名的函数。“ [6]
所以回答你的问题:lambda表达式与教会开发的完整lambda演算并不相关,而是与他发明的用于表示匿名函数的lambda表示法相关。
[1]教会,阿隆佐。 λ转换的结石。普林斯顿大学出版社,1941年。
[2]麦卡锡,约翰。 “符号表达式的递归函数及其机器计算,第一部分。” ACM 3.4(1960)的通讯:184-195。
<3>麦卡锡,约翰。 “LISP的历史。”编程语言的历史I. ACM,1978。url:http://jmc.stanford.edu/articles/lisp.html[4] Breuel,Thomas M.“C ++的词汇封闭。”参见1988年USENIX C ++会议论文集,第293-304页,科罗拉多州丹佛市,10月17日至21日。网址:http://web.archive.org/web/20060221054001/https://people.debian.org/~aaronl/Usenix88-lexic.pdf
[5]Järvi,J等人。 “Lambda表达式和闭包:单形Lambda的措辞(修订版4)”。网址:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2550.pdf
[6] Boost.Lambda http://www.boost.org/doc/libs/1_62_0/doc/html/lambda.html
[7] Jarvi,J和G.鲍威尔。 “Lambda库:C ++中的Lambda抽象。”技术报告378,图尔库计算机科学中心,2000年11月。网址:http://web.archive.org/web/20060428170631/http://www.tucs.fi:80/publications/techreports/TR378.php
Graham,Paul,“Lisp的根源”,2001年。http://www.paulgraham.com/rootsoflisp.html
van Emden,Maarten,“麦卡锡编程语言的秘诀”,2011年。https://vanemden.wordpress.com/2011/10/31/mccarthys-recipe-for-a-programming-language/
Cardone,Felice和J. Roger Hindley,“Lambda-calculus和Combinatory Logic的历史”,2006年。https://github.com/aistrate/Articles/blob/master/Haskell/History%20of%20Lambda-calculus%20and%20Combinatory%20Logic%20(Cardone,%20Hindley).pdf