我试图更好地掌握类型如何在 lambda 演算中发挥作用。诚然,很多类型理论的东西都超出了我的想象。Lisp 是一种动态类型的语言,它会大致对应于无类型的 lambda 演算吗?还是有某种我不知道的“动态类型的 lambda 演算”?
3 回答
Lisp 是一种动态类型的语言,它会大致对应于无类型的 lambda 演算吗?
是的,但只是粗略的。在“纯”无类型 lambda 演算中,一切都被编码为函数。(你可以在谷歌上搜索流行的“Church 编码”和不太流行的“Scott 编码”。)Lisp 有非函数数据,比如原子和数字等,所以这可以算作“用常量扩展的无类型 lambda 演算”。
另一个重要的区别是评估顺序。减少 lambda 演算项的规则是高度不确定的。(有一个定理,Church-Rosser 定理,它松散地说,只要事情终止,求值顺序就无关紧要。)在实践中,通常使用最左外最上的“正常顺序”减少来减少 lambda 项,因为如果任何减少策略都会终止,就是这样。这与 Lisp 非常不同,Lisp 总是在进行 beta 缩减之前将参数评估为正常形式。此评估顺序称为“按值调用”。
总而言之,Lisp 对应于一个无类型的、按值调用的 lambda 演算,它扩展了 constants。
John McCarthy 在他 1960 年 4 月的论文“符号表达式的递归函数及其机器计算,第一部分”中介绍了 LISP 。以下段落来自第 6 页:
e. 功能和形式。在数学中——在数理逻辑之外——通常不精确地使用“函数”这个词并将其应用于诸如 y 2 + x 之类的形式。因为稍后我们将使用函数的表达式进行计算,所以我们需要函数和形式之间的区别以及表示这种区别的符号。Church [3] 给出了这种区别和描述它的符号,我们与此稍有不同。
...
3. A. CHURCH,Lambda 转换的微积分(普林斯顿大学出版社,新泽西州普林斯顿,1941 年)。
关于 lambda-calculus的Wikipedia 文章有 Church 出版物的历史。McCarthy 引用的 1941 年论文似乎是关于类型化的lambda 演算,与 Wikipedia 文章的介绍相矛盾。
Lisp 中的lambda
关键字只能通过类比理解为指代 lambda 演算。Lisp lambda 表达式是一种匿名函数。
Lisp 不是“lambda 演算”,我不知道“lambda 演算”是什么。
如果您想通过那里的类型系统识别 lambda 演算,那么 Lisp 当然是它自己的。在 Scheme 之前的任何 lisp 中的 'lambda' 关键字肯定是自命不凡的,在 Scheme 之后也有空间说它是。仅仅使用'func'会更谦虚。Lisp 主要是一个列表处理器,而不是“lambda 演算”
有一次我也写了一篇相当广泛的文章,试图证明为什么 A:“函数式编程”这个词没有意义,B:为什么说“lambda 演算”而不是“类型系统”也是如此:
http://blog.nihilarchitect.net/archives/289/on-functional-programming/
另外,请记住,在 Lisp 中,所有函数实际上都是单个参数,并且只能将列表作为参数。