致所有了解lambda calculus的人:关于编程,它给你带来了什么好处?你会建议人们学习吗?
答案 0 :(得分:80)
lambda演算的好处是它是一个非常简单的计算模型,相当于图灵机。但是,虽然图灵机更像汇编语言,但lambda演算更像是一种高级语言。如果您学习教会编码,这将有助于您学习名为延续传递样式的编程技术,这对于实现回溯搜索和其他巧妙的技巧非常有用。
实践中lambda演算的主要用途是它是研究新编程语言思想的一个很好的实验室工具。如果您对新语言功能有所了解,可以将新功能添加到lambda演算,并且在时获得表达足以编程的内容足够简单,可以非常彻底地学习。这种用法对于语言设计者和理论家来说实际上比对程序员更有用。
Lambda演算本身也非常酷:就像知道汇编语言一样,它会加深你对计算的理解。在lambda演算中编程通用图灵机特别有趣。但这是基础数学,而不是实用的编程。
答案 1 :(得分:26)
如果您想在任何functional programming language中进行编程,这一点至关重要。我的意思是,了解图灵机有多大用处?好吧,如果你写C,语言范例与图灵机非常接近 - 你有一个指令指针和一个当前指令,机器在当前状态下采取一些动作,然后按照下一条指令运行。
在一种函数式语言中,你根本无法想到这一点 - 那不是语言范式。你必须回想起lambda演算,以及如何在那里评估术语。如果你不懂lambda演算,你就很难在函数式语言中有效。
答案 2 :(得分:22)
老实说,在函数式编程之前学习lambda演算使我意识到这两者与C一样无关紧要任何命令式编程。
Lambda演算是一种函数式编程语言,一种深奥的,如果你喜欢的图灵tarpit;不小心它也是第一个。
大多数函数式编程语言根本不需要你“学习”lambda演算,无论这意味着什么,lambda演算是极其微小的,你可以在一小时内“学习”它的公理。要知道它的结果,就像定点定理一样,Church-Rosser定理等等与函数式编程无关。
此外,lambda抽象通常被认为是'函数',我不同意它,它们是算法,而不是函数,微小差异,大多数'函数式语言'更像古典数学一样对待它们的函数。 / p>
但是,为了有效地使用Haskell,您需要了解某些类型系统,这与lambda演算无关,System F类型系统可以应用于所有“函数”并且不需要lambda抽象根本。通常在数学中我们说f:R ^ 2 - > R:f(x)= x ^ 2。我们可以说:f(x)= x ^ 2 :: R - > R - > R.事实上,Haskell非常接近这种表示法。
Lambda演算是一种理论形式主义,Haskell的函数实际上不再是'lambda抽象'而不是f:f(x)= x ^ 2真的,使lambda抽象有趣的是它使我们能够定义通常被视为'常量'作为'函数',由于巨大的计算开销,没有函数式语言。 Haskell和类似的只是System F的类型系统的一种限制形式,应用于日常经典数学中使用的函数。 Haskell中的函数肯定不是匿名的正式符号缩减 - 申请人,因为他们在lambda演算中。大多数函数式编程语言都不是基于符号缩减的重写系统。 Lisps在某种程度上是一个范例,但它本身就是一个范例,它的'lambda关键字'真的不满足于称它为lambda演算。
答案 3 :(得分:15)
我认为在实践中对编程使用lambda演算是一个非常小的系统,它捕获了抽象的本质(或“匿名函数”或闭包,如果你愿意的话)。除此之外我不认为它通常是必不可少的,除非你需要自己实现抽象(如Tetha(114646)所提到的)。
我也完全不同意Denis Bueno(114701),他说这对函数式编程至关重要。完全可以定义,使用或理解没有任何lambda演算的函数式语言。为了理解函数式语言中术语的评估(在我看来,这与函数式语言的使用有些矛盾),你很可能更好地学习术语重写系统。
答案 4 :(得分:11)
我同意那些说理论上可以在不学习lambda演算的情况下学习函数式编程的人 - 但不学习lambda演算的优点是什么?这并不是说需要大量的时间投入。
最有可能的是,它将帮助您更好地理解函数式编程。但即使它没有,它仍然是值得学习的一件很酷的事情。 Y-combinator是一件美丽的事情。
答案 5 :(得分:10)
如果你只想成为技术人员并编写程序来做事,那么你真的不需要知道lambda-calculus,有限状态机,下推自动机,正则表达式,无上下文语法,离散数学,等
但如果你对这些东西的深层谜团有好奇心,你可以开始想知道如何回答这些问题。这些概念很美,可以扩展您的想象力。顺便说一下,我也认为他们是一个更好的实践者。
让我迷上的是明斯基的书“计算:有限和无限机器”。
答案 6 :(得分:4)
lambda演算是一种计算模型,就像图灵机一样。因此,如果你需要为基于这个模型的语言实现一个特定的评估器是很有用的,但是,在实践中,你只需要基本的想法(呃。在函数体中语义正确的地方参数?),那就是它。
答案 7 :(得分:4)
学习lambda演算的一种有效方法是
http://en.wikipedia.org/wiki/Lambda_Calculus
或者,如果你想要更多,这里是我的博客致力于lambda演算和类似的东西
http://weblogs.manas.com.ar/lziliani/
作为计算的每个抽象,使用lambda演算,您可以对大多数编程语言中使用的内容进行建模,例如子类型。有关这方面的更多信息,那么在这种意义上实际使用lambda演算的最佳书之一是
答案 8 :(得分:4)
我发现Lambda演算有助于理解函数式编程在更深层次上的工作原理。特别是如何实现功能语言。
它使我更容易理解类型系统和评估策略等高级概念(例如,按名称呼叫与按值呼叫)。
我不认为人们需要了解Lambda演算的任何内容才能使用基本的函数编程技术。然而,理解lambda演算使学习高级编程理论变得更容易。
答案 9 :(得分:3)
我还想提一下,如果你在NLP领域做任何事情,lambda演算是构成语义学大量工作的基础。
答案 10 :(得分:0)
对我来说,好处是更紧凑的协同编程。东西倾向于水平流动而不是垂直流动。此外,它对于简单算法的原型设计非常有用。不知道我是否充分利用它,但我发现它非常有用。