74

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

4

11 回答 11

85

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

lambda 演算在实践中的主要用途是它是研究新的编程语言思想的一个很好的实验室工具。如果你对新的语言特性有想法,你可以将新特性添加到 lambda 演算中,你会得到一些表达能力足以编程的东西,同时又足够简单,可以深入研究。这种用途实际上更多地用于语言设计者和理论家,而不是程序员。

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

于 2008-12-17T08:06:36.100 回答
28

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

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

于 2008-09-22T12:55:18.693 回答
24

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

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

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

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

但是,例如要有效地使用 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 关键字”确实没有

于 2010-05-18T06:16:34.580 回答
16

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

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

于 2008-09-22T13:35:30.000 回答
13

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

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

于 2008-09-25T12:28:07.580 回答
11

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

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

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

于 2008-12-23T14:53:27.287 回答
5

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

于 2008-09-22T12:46:10.120 回答
4

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

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

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

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

作为计算的每个抽象,使用 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

于 2008-09-22T13:06:23.987 回答
4

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

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

我认为使用基本的函数式编程技术不需要了解任何关于 Lambda 演算的知识。然而,理解 lambda 演算可以更容易地学习高级编程理论

于 2011-09-23T00:27:39.617 回答
3

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

于 2008-10-11T06:06:29.977 回答
0

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

于 2008-09-22T12:45:58.483 回答