Link 在 C++ 中的 lambda 演算和 lambda 表达式之间

Link between lambda calculus and lambda expressions in C++

我想了解 C++ 中 lambda 演算和 lambda 表达式之间的 link 是什么。

首先,在无类型的 lambda 演算中,我们没有 "base values" 布尔值、整数或其他任何东西,因此所有内容都必须编码为函数,然后我们可以将任何项应用于任何其他项,这一旦有了类型系统,在 C++ 中就不完全是这样了。

此外,我已经看到 lambda 表达式在函数指针(当它们不捕获任何东西时)或函子(类 的唯一目的是包装函数)中转换。

所以我想知道,"lambda expression" 只是匿名函数的奇特名称,因此类似于 lambda 演算(在某种意义上,lambda 表达式中的项可以被视为未命名函数),或者还有更多到了吗?

提前致谢。

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

To take an example from the theory of functions of natural numbers, consider the expression . If we say, " is greater than 1,000," we make a statement which depends on x and actually has no meaning unless x is determined as some particular natural number. On the other hand, if we say, " is a primitive recursive function," we make a definite statement whose meaning in no way depends on a determination of the variable x (so that in this case x plays the role of an apparent, or bound, variable). … We shall hereafter distinguish by using … as the denotation of the corresponding function ….

在 20 世纪 50 年代,John McCarthy 在开发 Lisp 时采用了 Church 的符号。他 1960 年描述 Lisp 的论文解释说:

Functions and Forms. It is usual in mathematics—outside of mathematical logic—to use the word "function" imprecisely and to apply it to forms such as y^2 + x. Because we shall later compute with expressions for functions, we need a distinction between functions and forms and a notation for expressing this distinction. This distinction and a notation for describing it, from which we deviate trivially, is given by Church [citing Church [2]].

(他后来说 "To use functions as arguments, one needs a notation for functions, and it seems natural to use the lambda-notation of Church. I didn’t understand the rest of the book, so I wasn’t tempted to try to implement his more general mechanism for defining functions." [3] 然而,Lisp 出人意料地接近于实现一种形式的 lambda 演算。)

将匿名函数合并到 C++ 中的提议至少可以追溯到 1988 年 [4],距 C++ 发明仅 9 年,作者似乎很清楚 Lisp 的用法并采用了这个名称。将其纳入 C++11 标准 [5] 的提案以及导致它的工作(例如 [6]、[7])简单地说(例如)"The term originates from functional programming and lambda calculus, where a lambda abstraction defines an unnamed function." [6]

所以回答你的问题:lambda 表达式与 Church 开发的完整 lambda 演算关系不大,但与他发明的用于表示匿名函数的 lambda 符号有关。

参考资料

[1] 丘奇,阿朗佐。 lambda-conversion的演算。普林斯顿大学出版社,1941.

[2] 麦卡锡,约翰。 "Recursive functions of symbolic expressions and their computation by machine, Part I." ACM 通讯 3.4 (1960):184-195。

[3] 麦卡锡,约翰。 "History of LISP." 编程语言的历史 I. ACM, 1978. url: http://jmc.stanford.edu/articles/lisp.html

[4] Breuel, Thomas M. "Lexical closures for C++." 在 1988 年 USENIX C++ 会议记录中,第 293-304 页,科罗拉多州丹佛市,10 月 17 日至 21 日。 url: http://web.archive.org/web/20060221054001/https://people.debian.org/~aaronl/Usenix88-lexic.pdf

[5] Järvi、J 等人。 "Lambda Expressions and Closures: Wording for Monomorphic Lambdas (Revision 4)"。 url: 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. Powell。 "The Lambda Library : Lambda abstraction in C++." 技术报告 378,图尔库计算机科学中心,2000 年 11 月。url:http://web.archive.org/web/20060428170631/http://www.tucs.fi:80/publications/techreports/TR378.php

参考书目