【问题标题】:Which FP language follows lambda calculus the closest? [closed]哪种 FP 语言最接近 lambda 演算? [关闭]
【发布时间】:2012-05-17 14:28:23
【问题描述】:

哪种 FP 语言在代码外观、感觉和行为方面最接近 lambda 演算?

【问题讨论】:

  • 我投票决定关闭,因为这是主观的......
  • “我也想听听关于这是否重要的​​意见”这当然取决于你的要求,但我不明白为什么它会(重要)除非你的目标是学习lambda 演算(在这种情况下,您可能应该使用更直接的 lambda 演算实现,而不是“真正的”编程语言)。
  • @sepp2k:我的困境是:我听说 lc 有多么重要,以及它是 FP 的根源,但后来我尝试学习 FP 语言 x、y、z——它们都是似乎避免与正式的 lc 进行直接比较。这对于初学者来说是令人不安和困惑的。
  • @melwasul 只需学习您想学习的语言。 Lambda 演算在函数式语言的创建中发挥了重要作用(从某种意义上说,它启发了它们),但实际上没有理由将语言与 LC 的接近程度作为选择要学习的编程语言的标准。
  • 我正在通过 The Little Schemer,并且我还在尝试将函数(例如 p 132 insert-g)转换为 lambda 抽象。我看到了相似之处,想知道是否可以将其他 FP 语言翻译成 lc。但是,唐斯图尔特(和其他人)似乎说的是 FP 语言在需要执行实际任务时将基本 lc 抛在脑后,即当您想要编写 GUI 界面等时,递归数学的整个 Peano 风格并不总是可取的.

标签: functional-programming lambda-calculus


【解决方案1】:

这可能不是一个真实的答案,它更像是对你真正想要什么的猜测。

一般来说,lambda 演算中几乎没有什么——您基本上需要(一等)函数、函数应用程序和变量。这些天来,您将很难找到一种为您提供这些东西的语言......但是,当您尝试学习它时,事情可能会变得混乱 - 例如,它是很容易只使用普通数字,然后将它们与教堂数字混合。 (我看到很多学生都发生过这种情况,适应这种材料所需的正式思维方式已经够难了,以至于将编码扔到一堆并没有真正的帮助......)

正如 Don 所说,Scheme 非常接近于“普通”的无类型 lambda 演算,如果您正在阅读 The Little Schemer,它可能非常适合您的情况。如果你真的想使用“正确”的 LC,你需要确保你使用 only 函数(问题同上);但是您会遇到一些额外的问题,尤其是当您阅读有关该主题的各种其他文本时。首先,大多数文本将使用您在Scheme 中获得的惰性求值。其次,由于 LC 只有一元函数,因此缩短术语并使用例如 λxyz.zxy 而不是“真实”形式(在本例中为 Scheme 中的 λ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 表达式和函数应用程序的语言。做更多的工作,你也可以让它做咖喱,你甚至可以让它变得懒惰。这不是你现在应该尝试自己做的练习——但如果这听起来像你想要的,那么我可以给你指点my course(在课堂笔记中寻找“Schlac”)我们使用一种语言这就是上面所有的事情,而且它受到极大的限制,所以你得到的只是基本的 LC 结构。 (例如,3定义它之前是一个未绑定的标识符。)请注意,这不是一些解释器——它被编译成 Racket 代码,这意味着它运行得足够快,你甚至可以编写使用数字的代码。您也可以在那里获得该语言的实现,一旦安装,如果您以 #lang pl schlac 开头文件,您将获得该语言。

【讨论】:

    【解决方案2】:

    Lambda 演算是一个非常非常受限的编程模型。你只有功能。没有文字,没有内置的算术运算符,没有数据结构。一切都被编码为函数。因此,大多数函数式语言都试图以更方便日常编程的方式扩展 lambda 演算。

    Haskell 使用 lambda 演算的现代扩展作为其核心语言:System F,使用数据类型进行扩展。 (GHC 已将其进一步扩展到 System Fc,支持类型相等强制)。

    由于所有的 Haskell 都可以直接用它的核心语言编写,而且它的核心语言是类型化 lambda 演算(特别是二阶 lambda 演算)的扩展,因此可以说 Haskell 紧跟 lambda 演算,取模它的内建函数并发操作符;并行性;和记忆副作用(和 FFI)。这大大简化了新编译器优化的开发,也使给定程序的语义更易于理解。

    另一方面,Scheme 是无类型 lambda 演算的变体,扩展了副作用和其他非 lambda 演算概念(例如并发原语)。可以说是紧跟无类型 lambda 演算。

    唯一重要的人是:学习 lambda 演算的人;和编译器编写者。

    【讨论】:

    • 你的意思是开头的无类型微积分吗?
    • 其实untyped LC作为一个计算模型是完全不受限制的,所以你可以用它来表示从字面量、字符串、函数到所有数据结构和算法的一切,它只是一种潜在的不方便直接处理的形式所有这些东西。从技术上讲,您可以通过添加类型来限制它,但在您定义如何将 lambda 演算的语义应用于实践的上下文中,您可能会让事情变得更容易。
    猜你喜欢
    • 2010-09-09
    • 2011-03-05
    • 2013-02-08
    • 1970-01-01
    • 2010-10-05
    • 2018-04-09
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多