Lambda函数的理论基础

时间:2010-01-01 01:35:00

标签: language-agnostic lambda

我只是想知道在哪里可以找到一些语言无关的教程,了解lambda函数是什么,它们的用途是什么,以及不支持它们的语言中的粗略等价物。

我特别喜欢有关常用符号的任何信息。

谢谢!如果我能详细说明,请告诉我。

编辑:哦,嘿,我忘记了什么。

就术语而言,lambda表达式或函数,匿名/委托函数和闭包之间有什么区别?

6 个答案:

答案 0 :(得分:5)

要求与语言无关的治疗是非常严格的限制。我可以推荐几个关于lambda演算的教程:

如果你想了解在编程中使用lambda和高阶函数,我认为你最好放弃你的不可知论。 ML / Hope / Miranda / Haskell语言系列的一篇好文章是

    John Hughes的
  • Why Functional Programming Matters。 Hughes将向您展示一些有关高阶函数的有用用例,并且通常会帮助您理解为什么人们首先对所有这些lambda内容感兴趣。

答案 1 :(得分:5)

  

就术语而言,lambda表达式或函数,匿名/委托函数和闭包之间有什么区别?

关于术语:

  • lambda表达式是编写Alonzo Church为lambda演算发明的匿名函数的原始方式。在lambda演算中,所有函数都是纯粹的:没有任何副作用。

    麦卡锡对LISP采用lambda表达式为(lambda (arguments ...) body),拼写为“lambda”。苏斯曼和斯蒂尔后来使语义更忠实于教会的原创。表达式也被Haskell采用为\ arguments ... -> body,而反斜杠意图看起来像,但Haskell委员会使用右箭头代替点,因为他们想要点的功能组成。罗宾·米尔纳(Robin Milner)对ML的表达采用了这种表达方式,但拼写更为奇怪:fn args => body。所有这些表达式都被正确地称为lambda表达式,并且都表示匿名函数。只有在Haskell中,函数才是纯粹的; Lisp,ML和Scheme都允许body产生副作用。

  • 当您评估 lambda表达式或其他类型的嵌套函数时,您将获得闭包。闭包不仅包含lambda表达式的编译代码,还包含有关自由变量的信息。 (在Lisp和Scheme中,闭包存储自由变量的位置;在Haskell和ML中,闭包存储自由变量的。)

  • 匿名函数是一个更通用的概念,不需要局限于简单的绑定和正文。例如,在Smalltalk中,“block”表示匿名函数,但块的主体是一系列语句,因此它与lambda表达式绝对不同。

我担心“委托功能”无法帮助你。在我的世界里,这个词用来完全描述其他东西。

答案 2 :(得分:3)

你可能不想被提到Alonzo Church的lambda演算。

到目前为止,lambda函数最常用的符号是LISP。

Abelson& Sussman“计算机程序的结构和解释”可能是涵盖该主题的最易访问的文本,以及应用程序。

如果你想知道它的起点,请挖出麦卡锡的"Recursive Functions of Symbolic Expressions and Their Computation By Machine, Part I"

答案 3 :(得分:1)

学习Lisp的方言(Scheme目前非常受欢迎)。事实上,我不赞成约翰的建议,阅读“计算机程序的结构和解释”,并沿途学习Lisp。

Lisp最初并不是一种编程语言,而是一种描述计算的数学符号。它被设计为比图灵机更好地教学生(如果你曾经在图灵机上工作,你就会知道它们吸吮了多少)。 Lisp代码可以编译和执行的事实是一个意外。 Lisp非常接近lambda演算(这是一个不同的数学分支)这一事实也是一个意外(事实证明,只有在语言设计之后很久才证明)。

Lisp的大部分功能并没有真正“设计”到语言中,与其他语言复制Lisp的方式不同。它们出自Lisp基于的几个简单规则 - 就像数学中的定理出现在数字规则所基于的那样。

答案 4 :(得分:1)

如果没有碰到相关的SKI combinator calculus,你就不会对Lambda演算有太多的了解,所以你不妨将你的脚趾浸入其中并将其完成。令人愉快和奇怪的To Disect a Mockingbird,如果不是最好的起点,可能是最奇怪的。你的大脑会感觉被外星人重新布线。真。

一些疯狂的人为SKI计算实施了一种语言。这是一个打印斐波那契数字的Unlambda程序:

```s``s``sii`ki
  `k.*``s``s`ks
 ``s`k`s`ks``s``s`ks``s`k`s`kr``s`k`sikk
  `k``s`ksk
嘿,不要怪我。我没有发明它。

当事件显示Perl regular expression in a loop could implement the SKI calculus时,事情变得更加奇怪,因此,循环中的Perl正则表达式是图灵完成。

答案 5 :(得分:0)

你看过Wikipedia page on Lambda calculus了吗?它在数学理论上更重,但一旦你点击first class functions,最终会遇到更实际的问题。