我正试图更好地掌握类型如何在lambda演算中发挥作用。不可否认,很多类型理论的东西都在我的头上。 Lisp是一种动态类型语言,大致对应于无类型lambda演算?还是有某种“动态类型的lambda演算”,我不知道?
答案 0 :(得分:35)
Lisp是一种动态类型语言,大致对应于无类型的lambda演算?
是的,但只是粗略的。在“纯粹的”无类型lambda演算中,一切都被编码为函数。 (你可以谷歌搜索流行的“教会编码”和不那么受欢迎的“斯科特编码”。)Lisp有非功能数据,如原子和数字等,所以这将被视为“用常数扩展的无类型lambda演算。” / p>
另一个重要区别是评估顺序。减少lambda演算术语的规则是非常不确定的。 (有一个定理,Church-Rosser定理,松散地说,只要事情终止,评估顺序无关紧要。)在实践中,lambda术语通常使用最左边的最外面的“正常顺序”减少来减少,因为如果任何减少策略都会终止,那就是。 这与Lisp非常不同,Lisp总是在进行beta减少之前评估正常形式的参数。此评估顺序称为“按值调用”。
总之,Lisp对应于用常量扩展的无类型,按值调用的lambda演算。
答案 1 :(得分:3)
John McCarthy在his April, 1960 paper "Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I"中介绍了LISP。以下段落来自第6页:
即功能和形式。在数学中 - 通常在数学逻辑之外 - 通常不精确地使用“函数”这个词并将其应用于表格 例如y 2 + x。因为我们稍后会用函数的表达式计算, 我们需要区分功能和表格以及表达的表示法 这种区别。这种区别和用于描述它的符号来自 我们琐碎地偏离,由教会[3]给出。
...
3. A.教会,Lambda转换的计算(普林斯顿大学 Press,Princeton,N。J.,1941)。
Wikipedia article on lambda-calculus有教会出版物的历史。麦卡锡引用的1941年论文似乎是关于类型的 lambda-calculus,与维基百科文章的介绍相矛盾。
Lisp中的lambda
关键字只能通过类比来理解为lambda-calculus。 Lisp lambda表达式是anonymous function的一种类型。
答案 2 :(得分:-4)
Lisp不是'lambda演算',我不知道'lambda演算'是什么。
如果你想通过类型系统来识别lambda calculi,那么Lisp当然是它自己的。在Scheme之前的任何lisp中的'lambda'关键字肯定是自命不凡的,并且在Scheme之后还有空间说它是。只使用'func'本来会更谦虚。 Lisp主要是列表处理器,而不是'lambda演算'
我曾写过一篇相当广泛的文章,曾试图说明为什么A:“函数式编程”这个术语毫无意义而且B:为什么说'lambda演算'而不是'类型系统'也是如此:
http://blog.nihilarchitect.net/archives/289/on-functional-programming/
另外,请记住,在Lisp中,所有函数都有效单个参数,并且只能将列表作为参数。