知道lambda演算有多大帮助?[关闭]


72

对所有了解lambda演算的人:关于编程,它为您带来了什么好处?您会建议人们学习它吗?


抱歉,编辑认为数学+数学是重复的标记。
William Keller

Answers:


27

如果要使用任何功能性编程语言进行编程,这是必不可少的。我的意思是,了解图灵机有什么用?好吧,如果您编写C,则语言范例非常接近Turing机器-您有一条指令指针和一条当前指令,并且该机器在当前状态下执行某些操作,然后继续执行下一条指令。

在功能语言中,您根本不能那样想-这不是语言范式。您必须回想lambda演算,以及在那里如何对术语求值。如果您不知道lambda演算,那么要使用一种函数式语言有效将变得更加困难。


74
我衷心地怀疑它对于函数式编程是至关重要的(正如我在自己的回答中指出的那样)。而且,图灵机实际上从不(如果曾经)用来理解命令式编程。
mweerden

1
我认为这是“那些不了解LISP的人注定要重塑”的问题,尽管我想象绝大多数程序员都来自沉重的命令式背景,在这种背景下,求和循环的概念很普遍,而数组的概念减少不存在。反过来,我们都试图对我们的计算获得更多的控制和约束,唯一合理的发展方向是lambda演算的方向,反过来重新发明它,或者从不教给您lambda演算的编程语言中消化出来。你只是“得到”很多。
德米特里

@Dmitry我的意思是,lambda的想法是如此方便,以至于我们中的许多人都倾向于“重塑”,特别是如果您是一个元编程器,为它们的代码编写预处理器,以将“ for”循环变成“ for in”循环通过简单的转换,或者考虑一下转换,lambda演算通常可以自然地编写预处理器,从而解决您考虑的许多问题,因为您所考虑的只是转换以及如何尽可能长地(最好是最后)链接它们。没有lambda,您只会被复杂性淹没,一切崩溃或难以管理。
德米特里

84

lambda演算的好处是它是一个非常简单的计算模型,等效于Turing机。但是,虽然图灵机更像是汇编语言,但lambda演算却更像是一种高级语言。而且,如果您学习Church编码,这将有助于您学习称为延续传递样式的编程技术,这对于实施回溯搜索和其他巧妙技巧非常有用。

lambda演算在实践中的主要用途是它是研究新的编程语言思想的出色实验室工具。如果您对新的语言功能有个想法,可以将新功能添加到lambda演算中,这样一来,您不仅可以进行编程,而且可以进行简单全面的学习,从而获得足够的表现力。对于语言设计者和理论家而言,这种使用确实比程序员更多。

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


7
我看不到Church编码和CPS之间的联系。
cdiggins 2011年

24

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

Lambda演算是一种函数式编程语言,一种深奥的语言,如果您愿意,可以使用Turing 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微积分中的匿名形式化符号化申请者。大多数功能性编程语言都不是基于符号约简的重写系统。Lips在某种程度上是一个范例,但它本身就是一个范例,它的“ lambda关键字”确实没有。


我同意这一点:您想学习输入的lambda calculi。例如,它非常重要。哈斯克尔。
Alexandre C.

16

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

我也完全不同意Denis Bueno(114701)的观点,他说这对于函数式编程至关重要。完全无需任何lambda演算就可以完全定义,使用或理解功能语言。为了理解功能语言中术语的评估(我认为这与功能语言的使用有些矛盾),您很可能会更好地学习术语重写系统。


13

我与那些说这是理论上可以学习函数式编程,无需学习拉姆达同意演算,但有什么优势学习的演算?似乎并不需要花费大量时间。

最有可能的是,它将帮助您更好地理解函数式编程。但是,即使不是这样,它仍然是一件很值得学习的很酷的事情。该Y型组合子是美的东西。


3
毫无疑问,lambda演算是一件值得我们学习的奇妙事物。但是,阅读这些声称对理解函数式编程是有帮助的(甚至是必不可少的)的说法确实让我感到惊讶。我很难弄清楚它会如何帮助。我在这里想念什么吗?
mweerden

7
+1是提及“美丽”一词的唯一答案。除了实用性辩论之外,它可能是我所研究过的最美丽的数学领域。
基思·品森

11

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

但是,如果您对这些内容的更深层次的奥秘抱有好奇心,您可能会开始想知道如何回答这些问题。这些概念很漂亮,将扩大您的想象力。我也认为,顺便说一句,他们使一个更好的实践者。

让我着迷的是明斯基的书《计算:有限和无限的机器》。


2
你不必须知道“有限状态机,正则表达式,上下文无关文法”,但这些都是在很多编程任务非常有用的。没有这些,我将是1/100有效。例如,您不使用GREP吗?
TFuto 2014年

@TFuto:我在Windows上。我曾经使用过grep,但是随着这些地狱般的升级,过去可以正常工作的东西不再:)而且,这些形式化的概念更多地是CS的发明性方面,而不是遵从性的方面。他们给我带来麻烦,就像这里
Mike Dunlavey 2014年

1
我建议您重新访问REGEXP,例如在Java中。这是非常有表现力的事情,如果明智地使用它,则可以节省大量时间。顺便说一句,您可以将Windows上的GREP与Cygwin一起使用,或者将其与MinGW一起编译。而且,如果您还有更多时间,那么对ANTLR等的理解将是开发能力的巨大飞跃。您可以为大量语言生成解析器...因此,您可以替换手动输入解析和验证。
TFuto 2014年

5

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


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


3
对我而言,《通过Lambda微积分进行函数式编程简介》是最好的起点。
Edwin Dalorzo

4

我发现Lambda演算对于深入了解函数式编程的工作原理很有用。特别是如何实现功能语言。

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

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


3

我还要提及的是,如果您正在NLP领域做任何事情,那么lambda演算是组成语义学上大量工作的基础。


0

对我来说,好处是更紧凑的协同编程。东西倾向于水平流动比垂直流动更多。另外,它对于原型简单算法非常有用。不知道我是否正在充分利用它,但我发现它非常有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.