哪种FP语言遵循lambda演算最接近其代码的外观,感觉,就像lambda演算抽象一样?
答案 0 :(得分:5)
这可能不是一个真正的答案,更多的是对你真正想要的东西的猜测。
一般来说,lambda演算中很少 - 你基本上需要(第一类)函数,函数应用程序和变量。这些天你很难找到一种不为你提供这些东西的语言......然而,当你试图了解它时,事情会变得混乱 - 例如,它是很容易只使用普通数字,然后将它们与教堂数字混合在一起。 (我已经看到这种情况发生在许多学生身上,适应了这种材料所需要的正式思维,这种形式很难将编码扔到桩上并没有真正帮助......)
正如唐所说,Scheme非常接近“普通”无类型lambda演算,如果你正在通过The Little Schemer,它可能非常适合你的情况。如果您真的想使用“正确的”LC,则需要确保仅使用 功能(如上所述);但是你会遇到一些额外的问题,特别是当你阅读有关这个主题的各种其他文本时。首先,大多数文本将使用您不在Scheme中获得的延迟评估。其次,由于LC只有一元函数,因此缩短术语和使用是很常见的,例如,λxyz.zxy
而不是“真实”形式,在本例中为λx.(λy.(λz.((z x) y)))
或(lambda (x) (lambda (y) (lambda (z) ((z x) y))))
方案。 (这称为Currying。)
所以,是的,Scheme与LC非常接近,但对所有这些问题并没有多说。 Haskell可以说是一个更好的候选者,因为它既懒惰又可以用于函数的多个参数。 OTOH,你正在处理一种键入的语言,这是一个非常重要的行李带入这个游戏 - 如果你尝试做TLS风格的例子,你会遇到一些严重的问题......
如果您确实希望得到所有内容(懒惰,简写,无类型,足够接近Scheme),那么Racket还有另外一点需要考虑。在高级别,它与Scheme非常接近,但是它可以更快地将一种限制了Racket语言的语言强加到lambda
表达式和函数应用程序。通过一些更多的工作,你也可以让它做到currying,你甚至可以使它变得懒惰。这不是一个你应该尝试自己做的练习 - 但如果它听起来像你想要的那样,那么我可以指出你my course(在课堂笔记中寻找“Schlac”)我们使用的地方这是一种完成上述所有工作的语言,它受到极大限制,因此您只能获得基本的LC结构。 (例如,3
是一个未绑定的标识符,直到你定义它。)请注意,这不是一些解释器 - 它被编译成Racket代码,这意味着它运行得足够快,你可以甚至编写使用数字的代码。您也可以在那里获得该语言的实现,一旦安装了该语言,如果您使用#lang pl schlac
启动文件,则会获得此语言。
答案 1 :(得分:3)
Lambda演算是一种非常非常有限的编程模型。你只有功能。没有文字,没有内置算术运算符,没有数据结构。一切都被编码为函数。因此,大多数函数式语言都尝试以一种方式扩展lambda演算,使其更便于日常编程。
Haskell使用lambda演算的现代扩展作为其核心语言:System F,扩展了数据类型。 (GHC已将此进一步扩展到System Fc,支持类型平等强制。)
由于所有Haskell都可以直接用其核心语言编写,并且其核心语言是类型化lambda演算(特别是二阶lambda演算)的扩展,可以说Haskell紧跟lambda演算,模拟其内置函数并发运算符;并行;和记忆副作用(和FFI)。这使得新编译器优化的开发变得更加容易,并且使得给定程序的语义更易于理解。
另一方面,Scheme是无类型lambda演算的变体,扩展了副作用和其他非lambda演算概念(例如并发原语)。可以说它紧跟着无类型的lambda演算。
唯一重要的是:人们学习lambda演算;和编译器编写者。