【发布时间】:2012-11-20 00:54:00
【问题描述】:
我花了一个小时阅读这个网站上的许多帖子以及其他关于 lambda 和闭包的帖子。我想我了解它们是什么,即它们是如何工作的,但我不明白为什么它们存在。我看到的许多例子都含糊地提到了它们的“力量”,但在每一种情况下,我都能想到一种更简单的方法来完成所说明的事情。也许这是由于示例故意过于简单(为了便于理解),或者我可能很密集。但我真正想要的是看到一个清晰的示例,说明您可以使用闭包或 lambda 来完成,而如果没有它,您无法完成。也许这是一个很复杂的问题,因为所有编程范式最终都归结为相同的机器指令,并且可以用一种语言完成的任何事情都可以以某种方式用另一种语言完成。所以我想我真正要问的是一个用闭包做的事情的例子,它比没有做的更优雅(我见过的任何例子似乎都不是这种情况)。
这就是我要说的。
What is a 'Closure'? 的主要答案,Scheme 中的一个例子:
(define (make-counter)
(let ((count 0))
(lambda ()
(set! count (+ count 1))
count)))
(define x (make-counter))
(x) returns 1
(x) returns 2
...etc...
我真的不知道 Scheme,但我想我知道发生了什么。但是,这不是更直接并完成同样的事情吗?伪代码:
function incrementCount(var counter) {
counter++;
return counter;
}
counter = 1;
counter = incrementCount(counter);
counter = incrementCount(counter);
这是关于 lambdas 的另一个:What is a lambda (function)?
给出的 JavaScript 示例:
var adder = function (x) {
return function (y) {
return x + y;
};
};
add5 = adder(5);
add5(1) == 6
再说一遍,为什么要那样做?为什么不直接说:
function adder(x, y) {
return x + y;
}
adder(5, 1);
我看到的每个示例似乎都是一种过于复杂的方法,可以用基本功能轻松完成。这些例子当然不能说明我能看到的任何惊人的酷“力量”。所以请有人启发我,我一定错过了一些东西。谢谢。
【问题讨论】:
-
这里有一些来自 python POV 的好东西。 pythonconquerstheuniverse.wordpress.com/2011/08/29/…
-
lambda 非常强大,因为它们可以出现在函数不能出现的表达式中。这允许您在不实际或不可能的情况下使用“内联”函数。例如,在 Python 中,这意味着对于任何排序或迭代函数,key 参数可以是一个函数。
-
闭包允许你隐式捕获状态。一个例子是回调模式:在 C 中,当您注册回调时,回调通常采用包含显式状态的参数。使用闭包,您只需将一个字段设置为闭包,然后在闭包中访问对象的状态。
-
快速获得柯里化真正威力的最佳示例是解析组合子。看看 Parsec 或任何其他类似的实现。
-
incrementCount(counter); incrementCount(counter);都将评估为 2。不是吗?
标签: lambda closures computer-science terminology