Lambda是什么?

95

有人能提供Lambda的良好描述吗?我们为它们创建了一个标签,并将其放在C#问题的秘密中,但我还没有找到一个关于它们是什么以及如何解释的好定义。


1
作为一个起点,可以尝试阅读Wikipedia的lambda演算文章。然后再阅读 Wikipedia的函数式编程文章 作为进一步学习的跟进。 - Thorsten79
2
可能是什么是lambda(函数)?的重复问题。 - nawfal
这里美妙地解释了AMDA表达式:https://chaseyourjava.blogspot.in/2017/11/lamda-expression-in-java-8.html - Jameer Mulani
7个回答

135
闭包、Lambda 和匿名函数并不完全相同。
匿名函数是任何没有(或者至少不需要)自己名称的函数。
闭包是在声明时可以访问其词法作用域中的变量,并且即使它们已经超出了作用域,仍然可以访问的函数。 匿名函数不一定是闭包,但在大多数语言中它们是闭包,否则就没那么有用了。
对于计算机科学来说,Lambda 的定义并不是很明确。 许多语言甚至不使用这个术语;相反,他们只会称它们为闭包或匿名函数,或者发明自己的术语。 在 LISP 中,Lambda 只是一个匿名函数。 在 Python 中,Lambda 是一个仅限于单个表达式的匿名函数; 如果需要多于一个表达式,则需要一个命名函数。 这两种语言中的 Lambda 都是闭包。

该术语可能意味着λ演算。http://en.wikipedia.org/wiki/Lambda_calculus - Steven A. Lowe
哇,我希望我有更多的赞来给这个问题。我看到很多技术答案都被术语所困扰,但这个回答简明扼要,立即点明了重点。 - Matthew Stopa
5
根据代码结构定义的某个变量可能存在的区域(即作用域),通常由于语言特性,函数定义了一个词法作用域:在函数内声明的任何变量都无法在函数外部访问。 - Eevee

19

也称为闭包或匿名函数... 我在这里找到了最好的描述(链接)。基本上,它是一段内联的代码块,可以作为参数传递给函数。


18
"Lambda"指的是Lambda演算或特定的lambda表达式。Lambda演算基本上是处理函数的逻辑和数学分支,是函数式编程语言的基础。
~ William Riley-Land

8

这只是一个内联声明的匿名函数,通常在你不想编写完整的函数时被分配给委托。

在像lisp/scheme这样的语言中,它们经常自由地作为函数参数传递,但在C#中,惯用法通常只发现lambda被用于函数的惰性评估,如linq,或使事件处理代码更加简洁。


5

在编程中,没有所谓的“lambda”这样的东西。这取决于语言等因素。

简而言之,通常具有“lambda”的语言将该术语用于表示匿名函数或在某些情况下表示闭包。就像在 Ruby 中:

f = lambda { return "this is a function with no name" }
puts f.call

4
作为之前答案的回应:
-匿名函数重要的不是它们不需要名称。
-闭包是一个独立的概念。
-一篇庞大的维基百科文章并没有使这个问题更加清晰。
以下是我的三部分答案:
1. Lambda是一个既是函数又是表达式的东西。这是最重要的。
2. 许多实现所谓“lambda”的语言会添加一些语法糖,以使编写这些短函数更加容易和快速,但这并非必需。
3. 一些语言可能要求lambda没有副作用。在功能上,这将是一个更纯粹的lambda。
当一个函数是一个表达式时,它是语言中的“一等公民”。我可以用它做所有重要的事情:
x = lambda(){ return "Hello World"; }

doit( 1, 2, lambda(a,b){ return a > b; }, 3 )

x = (lambda(a){ return a+1; }) + 5  // type error, not syntax error

(lambda(a,b){ print(a); log(b); })( 1, 2 )  // () is valid operator here

1

我猜你指的是这一行:在像Lisp和Python这样的编程语言中,lambda是一个用于表示匿名函数或闭包的运算符,遵循lambda演算的用法。我已经浏览了文章但错过了那个。 - Fred

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接