【问题标题】:Link between lambda calculus and lambda expressions in C++C++ 中 lambda 演算和 lambda 表达式之间的联系
【发布时间】:2018-01-11 15:37:10
【问题描述】:

我试图解开 lambda 演算和 C++ 中的 lambda 表达式之间的联系。

首先,在无类型的 lambda 演算中,我们没有布尔值、整数或 whatevr 之类的“基值”,因此所有内容都必须编码为函数,然后我们可以将任何术语应用于任何其他术语,这不是一旦有类型系统,C++ 中的情况就完全如此。

此外,我看到 lambda 表达式要么转换为函数指针(当它们不捕获任何内容时),要么转换为仿函数(仅用于包装函数的类)。

所以我想知道,“lambda 表达式”只是匿名函数的一个花哨名称,因此它类似于 lambda 演算(从某种意义上说,lambda 表达式中的术语可以被视为未命名的函数),还是还有更多?

提前致谢。

【问题讨论】:

  • en.wikipedia.org/wiki/Lambda_expression:"计算机编程中的Lambda表达式,也叫匿名函数..." ; “lambda 演算中的 Lambda 表达式,数学逻辑中的形式系统……”这是 Google 上的 3 链接。
  • 什么是链接 btw java 和 java 脚本?他们都有java这个词。
  • @Slava 公平地说,维基百科说有一些历史联系。
  • @Slava 所以这个问题可以通过详细说明这种联系来回答,恕我直言。
  • @HolyBlackCat 确定我不反对,也不会反对这个问题

标签: c++ lambda lambda-calculus


【解决方案1】:

Alonzo Church 所做的不仅仅是发明了 lambda 微积分 - 他想出了 一种有用的函数表示法,lambda 表示法,他在 1941 年关于 lambda 演算 [1] 的书的第 5-7 页中进行了描述:

以自然数函数理论为例, 考虑表达式。如果我们说“ 大于 1,000”,我们会做出一个依赖于 x 的语句,并且实际上没有任何意义,除非 x 被确定为某个特定的自然数.另一方面,如果我们说“ 是一个原始递归函数”,我们会做出一个明确的陈述,其意义绝不取决于变量 x 的确定(因此在这个case x 扮演一个明显的或绑定的变量的角色)。 … 我们应该 以后用…作为对应函数的表示来区分…。

在 1950 年代,当 John McCarthy 开发 Lisp 时,他采用了 Church 的表示法。他在 1960 年描述 Lisp 的论文解释说:

函数和形式。在数学中——在数理逻辑之外——通常不精确地使用“函数”这个词并将其应用于诸如 y^2 + x 之类的形式。因为我们稍后将使用函数的表达式进行计算,所以我们需要函数和形式之间的区别以及表示这种区别的符号。 Church [引用 Church [2]] 给出了这种区别和描述它的符号,我们与此稍有不同。

(他后来说“要使用函数作为参数,需要一个函数符号,使用 Church 的 lambda 符号似乎很自然。我没看懂这本书的其余部分,所以我没有很想尝试实现他定义函数的更通用的机制。” [3] 然而,Lisp 惊人地接近实现 lambda 演算的一种形式。)

将匿名函数合并到 C++ 中的建议至少可以追溯到 1988 [4],也就是 C++ 发明仅 9 年后,作者似乎很清楚 Lisp 的用法并采用了这个名称。将其纳入 C++11 标准 [5] 以及相关工作(例如 [6]、[7])的提案只是简单地说(例如)“该术语源自函数式编程和 lambda 演算,其中一个 lambda 抽象定义了一个未命名的函数。” [6]

所以回答你的问题:lambda 表达式与 Church 开发的完整 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

参考书目

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多