【问题标题】:How helpful is knowing lambda calculus? [closed]了解 lambda 演算有多大帮助? [关闭]
【发布时间】:2010-09-11 23:46:11
【问题描述】:

致所有知道lambda calculus 的人:关于编程,它给你带来了什么好处?你会建议人们学习它吗?

【问题讨论】:

  • 抱歉编辑,认为 math + maths 是重复标签。

标签: math functional-programming computer-science lambda-calculus


【解决方案1】:

对我来说好处是更紧凑的协同编程。东西倾向于水平流动而不是垂直流动。此外,它对于制作简单算法的原型非常有用。不知道我是否充分发挥了它的潜力,但我觉得它非常有用。

【讨论】:

    【解决方案2】:

    lambda 演算是一种计算模型,就像图灵机一样。因此,如果您需要基于此模型为语言实现某个评估器,这很有用,但是,在实践中,您只需要基本思想(嗯。将参数在语义上正确地放在函数体中?)这就是它。

    【讨论】:

      【解决方案3】:

      如果您想在任何functional programming language 中编程,这是必不可少的。我的意思是,了解图灵机有多大用处?好吧,如果你写 C,语言范式非常接近图灵机——你有一个指令指针和一个当前指令,机器在当前状态下采取一些行动,然后慢慢进入下一条指令。

      在函数式语言中,您根本不能那样思考——这不是语言范式。您必须回想一下 lambda 演算,以及那里如何评估术语。如果您不了解 lambda 演算,那么您将很难在函数式语言中发挥作用。

      【讨论】:

      • 我真诚地怀疑它对于函数式编程是否必不可少(正如我在自己的回答中指出的那样)。此外,图灵机实际上从未(如果有的话)用于理解命令式编程。
      • 我认为这是“那些不了解 LISP 的人注定要重新发明它”的问题,尽管我认为绝大多数程序员来自沉重的命令式背景,其中循环的概念用于求和很常见,并且不存在数组缩减的想法。反过来,我们都试图在我们的计算中获得更多的控制和纪律,唯一合理的方向是 lambda 演算的方向,反过来重新发明它,或者从不教你 lambda 演算但的编程语言中消化它你只是“得到”了很多。
      • @Dmitry 我的意思是,lambda 的想法非常方便,以至于我们中的许多人倾向于“重新发明它”,特别是如果您是一个元程序员,为他们的代码编写预处理器以“为" 通过简单的转换循环到 "for in" 循环中,或者想一想,lambda 演算通常会解决您在编写预处理器时自然想到的许多事情,因为您所考虑的只是转换以及如何尽可能长地链接它们,最好是到最后。如果没有 lambda,您只会被复杂性所淹没,一切都会崩溃,或者无法管理。
      【解决方案4】:

      学习 lambda 演算的一种可能方法是

      http://en.wikipedia.org/wiki/Lambda_Calculus

      或者,如果你想要更多,这里是我的博客,专门讨论 lambda 演算和类似的东西

      http://weblogs.manas.com.ar/lziliani/

      作为计算的每个抽象,使用 lambda 演算,您可以对大多数编程语言中使用的东西进行建模,例如子类型化。有关这方面的更多信息,从这个意义上讲 lambda 演算的实际用途最好的书籍之一是

      http://www.amazon.com/Types-Programming-Languages-Benjamin-Pierce/dp/0262162091/ref=sr_1_1?ie=UTF8&s=books&qid=1222088714&sr=8-1

      【讨论】:

      【解决方案5】:

      我认为 lambda 演算在编程实践中的使用是一个非常小的系统,它捕捉了抽象的本质(或者“匿名函数”或闭包,如果你愿意的话)。除此之外,我认为这通常不是必需的,除非您需要自己实现抽象(如 Tetha (114646) 所述)。

      我也完全不同意 Denis Bueno (114701) 的说法,他说函数式编程是必不可少的。完全可以在没有任何 lambda 演算的情况下定义、使用或理解函数式语言。为了理解函数式语言中术语的评估(在我看来,这与函数式语言的使用有些矛盾),您很可能最好学习术语重写系统。

      【讨论】:

        【解决方案6】:

        我同意那些说理论上可以在不学习 lambda 演算的情况下学习函数式编程的人的观点,但是学习 lambda 演算有什么好处呢?这似乎不需要大量的时间投资。

        很有可能,它将帮助您更好地理解函数式编程。但即使没有,它仍然是一件很酷的事情,值得学习。 Y-combinator 是美丽的事物。

        【讨论】:

        • lambda 演算毫无疑问是值得学习的好东西。然而,阅读这些声称它对理解函数式编程很有帮助(甚至是必不可少的)的说法确实让我感到惊讶。我很难弄清楚它会有什么帮助。我在这里错过了什么吗?
        • +1 是唯一提到“美”这个词的答案。抛开实用性争论不谈,这可能是我研究过的最美丽的数学领域。
        【解决方案7】:

        我还想提一下,如果您在 NLP 领域做任何事情,那么 lambda 演算是组合语义中大量工作的基础。

        【讨论】:

          【解决方案8】:

          lambda 演算的好处是它是一个极其简单的计算模型,相当于图灵机。但是,虽然图灵机更像是汇编语言,但 lambda 演算更像是一种高级语言。如果您学习 Church 编码,它将帮助您学习称为 continuation-passing style 的编程技术,这对于实现回溯搜索和其他巧妙的技巧非常有用。

          lambda 演算在实践中的主要用途是 它是研究新的编程语言思想的绝佳实验室工具。如果您对新的语言功能有想法,您可以将新功能添加到 lambda 演算中,您会得到足够表达以进行编程,同时 足够简单,可以非常彻底地学习。这种用途对于语言设计者和理论家来说确实比程序员更多。

          Lambda 演算本身也很酷:就像了解汇编语言一样,它将加深您对计算的理解。在 lambda 演算中编写通用图灵机特别有趣。但这是基础数学,而不是实际编程。

          【讨论】:

          • 我没有看到 Church 编码和 CPS 之间的联系。
          【解决方案9】:

          如果你只想成为一名技术人员并编写程序来做事,那么你真的不需要了解 lambda 演算、有限状态机、下推自动机、正则表达式、上下文无关文法、离散数学、等等

          但是,如果您对这些东西背后的更深奥秘感到好奇,您可能会开始想知道如何回答这些问题。这些概念很漂亮,会扩展你的想象力。我也认为他们,顺便说一句,使一个更好的实践者。

          让我着迷的是 Minsky 的书《计算:有限与无限机器》。

          【讨论】:

          • 你没有了解“有限状态机、正则表达式、上下文无关语法”,但这些在许多编程任务中非常有用。如果没有这些,我的效率会是 1/100。例如。你不使用 GREP 吗?
          • @TFuto:我在 Windows 上。我曾经拥有 grep,但随着这些地狱般的升级,过去可以工作的东西不再适用了 :) 此外,这些正式概念更多地体现在 CS 的创造性方面,而不是墨守成规边。他们给我带来了麻烦,like here
          • 我建议您重新访问 REGEXP,例如在爪哇。这是一件非常有表现力的事情,如果使用得当,可以节省大量时间。顺便说一句,您可以在 Windows 上使用 Cygwin 使用 GREP 或使用 MinGW 编译它。如果你有更多的时间,理解例如ANTLR 是开发能力的巨大飞跃。您可以为大量语言生成解析器...因此您可以替换手动输入解析和验证。
          【解决方案10】:

          说实话,在函数式编程之前学习 lambda 演算让我意识到这两者与 C 与任何命令式编程一样无关。

          Lambda 演算是一种函数式编程语言,一种深奥的语言,如果你喜欢的话,它是一个图灵 tarpit;不小心也是第一个。

          大多数函数式编程语言根本不要求您“学习” lambda 演算,无论如何,lambda 演算非常小,您可以在不到一个小时的时间内“学习”它的公理。要知道它的结果,就像不动点定理一样,Church-Rosser 定理等与函数式编程无关。

          此外,lambda 抽象通常被认为是“函数”,我不同意这一点,它们是算法,而不是函数,这是一个微小的区别,大多数“函数式语言”更多地以经典数学的方式处理它们的函数。

          但是,例如要有效地使用 Haskell,您确实需要了解某些 类型系统,这与 lambda 演算无关,System F 类型系统可以应用于所有“函数”并且不需要 lambda抽象。通常在数学中我们说 f : R^2 -> R : f (x) = x^2。我们可以说:f (x) = x^2 :: R -> R -> R。事实上,Haskell 非常接近这种表示法。

          Lambda 演算是一种理论形式,Haskell 的函数实际上并不比 f 更多的“lambda 抽象”:f(x) = x^2 实际上,lambda 抽象的有趣之处在于它使我们能够定义通常被视为'常量'作为'函数',由于巨大的计算开销,没有函数式语言可以做到这一点。 Haskell 等只是 System F 的类型系统的一种受限形式,适用于日常经典数学中使用的函数。 Haskell 中的函数当然不是 lambda 演算中的匿名形式符号归约申请者。大多数函数式编程语言不是基于符号归约的重写系统。 Lisp 在某种程度上是一种范式,但它本身就是一种范式,它的“lambda 关键字”确实不能满足将其称为 lambda 演算。

          【讨论】:

          • 我同意这一点:你想学习 typed lambda calculi。它在例如非常重要。哈斯克尔。
          【解决方案11】:

          我发现 Lambda 演算有助于更深入地了解函数式编程的工作原理。尤其是如何实现函数式语言。

          它让我更容易理解类型系统和评估策略等高级概念(例如,按名称调用与按值调用)。

          我认为使用基本的函数式编程技术不需要了解任何有关 Lambda 演算的知识。但是了解 lambda 演算可以更轻松地学习高级编程理论

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-22
            相关资源
            最近更新 更多