哪种函数式编程语言在代码外观、感觉和行为上最接近于 λ演算的抽象?
正如Don所说,Scheme与“普通”的无类型λ演算非常接近,如果您正在学习《The Little Schemer》,那么它可能非常适合您。如果您真的想使用“正确”的LC,则需要确保仅使用函数(以上述问题为例);但是,在阅读有关此主题的各种其他文本时,您将遇到一些其他问题。首先,大多数文本将使用惰性求值,在Scheme中您不会得到这种求值方式。其次,由于LC仅具有一元函数,因此缩短术语并使用例如λxyz.zxy
而不是在此情况下的“真实”形式λx.(λy.(λz.((z x) y)))
或(lambda (x) (lambda (y) (lambda (z) ((z x) y))))
在Scheme中是非常常见的。(这称为Currying。)
所以,没错,Scheme与LC非常接近,但是这并不意味着什么,因为存在很多问题。Haskell可能是更好的选择,因为它既是惰性的,又可以对多个参数进行柯里化。但是,你要处理的是一种有类型的语言,这是一个相当沉重的负担,如果你尝试做TLS样式的示例,你会陷入严重的困境...
如果你想要得到所有的东西(懒惰、简写、无类型、足够接近Scheme),那么Racket有另一个值得考虑的点。从高层次上讲,它非常接近Scheme,但它更进一步,你可以快速地创建一个语言,它是将Racket语言限制为只有lambda
表达式和函数应用。通过更多的工作,你甚至可以让它变得懒惰。这不是你现在应该尝试做的练习,但如果听起来像你想要的,请看一下我的课程(在课堂笔记中寻找“Schlac”),我们使用了一种正在做以上所有事情的语言,它非常受限,因此你只能获得基本的LC结构。例如,3
是一个未绑定的标识符,直到你定义它。请注意,这不是某种解释器——它被编译成Racket代码,这意味着它运行得足够快,你甚至可以编写使用数字的代码。你也可以在那里获得该语言的实现,一旦你安装了它,如果你用#lang pl schlac
开始文件,你就会得到这个语言。