对于所有了解lambda演算的人:在编程方面它给你带来了什么好处?你会建议人们学习吗?
lambda演算的好处是它是一个非常简单的计算模型,相当于图灵机.但是,虽然图灵机更像汇编语言,但lambda演算更像是一种高级语言.如果你学习了教会编码,这将有助于你学习称为延续传递风格的编程技术,这对于实现回溯搜索和其他巧妙的技巧非常有用.
lambda演算在实践中的主要用途是它是研究新编程语言思想的一个很好的实验室工具.如果你有一个新语言功能的想法,你可以将新功能添加到lambda演算中,你可以得到一些表达足够程度的东西,同时又足够简单,可以非常彻底地学习.这种用法对于语言设计者和理论家来说实际上比对程序员更有用.
Lambda演算本身也非常酷:就像知道汇编语言一样,它会加深你对计算的理解.在lambda演算中编程通用图灵机特别有趣.但这是基础数学,而不是实用的编程.
如果你想用任何函数式编程语言编程,这是必不可少的.我的意思是,了解图灵机有多大用处?好吧,如果你写C,语言范例与图灵机非常接近 - 你有一个指令指针和一个当前指令,机器在当前状态下采取一些动作,然后按照下一条指令进行操作.
在函数式语言中,你根本无法想到这一点 - 那不是语言范式.你必须回想起lambda演算,以及如何在那里评估术语.如果你不懂lambda演算,你就很难在函数式语言中有效.
说实话,在函数式编程之前学习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的函数实际上不再是'lambda抽象'而不是f:f(x)= x ^ 2真的,使lambda抽象有趣的是它使我们能够定义通常被视为'常数'的东西作为"函数",由于巨大的计算开销,没有函数式语言可以做到这一点.Haskell和类似的只是System F 类型系统的一种限制形式,适用于日常经典数学中使用的函数.Haskell中的函数肯定不是匿名的正式符号缩减 - 申请人,因为他们在lambda演算中.大多数函数式编程语言都不是基于符号缩减的重写系统.Lisps在某种程度上,但这本身就是一个范例,它的'lambda关键字'真的不满足于称它为lambda演算.
我认为在实践中使用lambda演算是因为它是一个非常小的系统,可以捕获抽象的本质(或"匿名函数"或闭包,如果你愿意的话).除此之外我不认为它通常是必不可少的,除非你需要自己实现抽象(如Tetha(114646))所述).
我也完全不同意Denis Bueno(114701),他说这对函数式编程至关重要.完全可以定义,使用或理解没有任何lambda演算的函数式语言.为了理解函数式语言中术语的评估(在我看来,这与函数式语言的使用有些矛盾),你很可能更好地学习术语重写系统.
我与那些说这是理论上可以学习函数式编程,无需学习拉姆达同意演算,但有什么优势不学习的演算?这并不是说需要大量的时间投入.
最有可能的是,它将帮助您更好地理解函数式编程.但即使它没有,它仍然是值得学习的一件很酷的事情.该Y型组合子是美的东西.
如果你只想成为技术人员并编写程序来做事,那么你真的不需要知道lambda演算,有限状态机,下推自动机,正则表达式,无上下文语法,离散数学等.
但是,如果你对这些东西的深层谜团有好奇心,你可以开始想知道如何回答这些问题.这些概念很美,可以扩展您的想象力.顺便说一下,我也认为他们是一个更好的实践者.
让我迷上的是明斯基的书"计算:有限和无限机器".