为什么lambda不是闭包,反之亦然?

时间:2015-01-04 02:44:30

标签: lambda functional-programming closures

我一直试图得到这个问题的答案,但我一直无法找到让我信服的东西。有人知道关于这个的最后一句话吗?有任何清晰简单的例子吗?顺便说一下,我已经看到了这个问题: What is the difference between a 'closure' and a 'lambda'?

我找到了非常有趣的答案,但是当谈到我原来的问题时,我会更加困惑。

我真的很感激任何帮助。

1 个答案:

答案 0 :(得分:0)

事实上,很多人都很困惑,其中包括对你所关联问题的答案中的一些人。

让我重申一下我的答案: lambda是(匿名)函数表达式的语言构造闭包是一种实现技术,用于使本地函数成为一流的。

例如,在函数式语言中有一个命名函数定义

f x = x + 1              (* 1 *)

通常只是lambda表达式的简写:

f = lambda x => x + 1    (* 2 *)

(反之亦然,lambda可以看作辅助本地定义的简写,例如,

lambda x => x + 1

相当于let-expression:

let f x = x + 1 in f

换句话说,lambdas只是语法,它们本身并不暗示任何语义。

另一方面,闭包是实现本地函数的一种方式,无论是表示为lambda还是以命名形式表示。例如,考虑:

g x = let h y = x + y in h    (* 3 *)

或等效地:

g x = lambda y => x + y       (* 4 *)

(功能语言甚至允许将后者缩写为

g x y = x + y

这里内部函数引用外部函数的局部变量(参数x)。类似g 2的表达式将返回一个函数,但此函数的内部表示不仅仅包含h的“代码”,还必须包含x = 2的信息。后者称为闭包环境,闭合环境和“代码”对称为“闭包”。这个名字来自数学:一个函数对象“关闭”它的环境(来自外部作用域的名称),就像一个自包含的实体一样。在实现中,这很重要,以便允许这些函数作为独立值持久存在,即使周围的调用已经很长时间返回。

因此,正如您所看到的,有些函数被写为lambda(例如上面的2和4),并且有些函数必须表示为闭包(例如,上面的3和4),但是可以发生一个没有其他(例如,2或3)。 (尽管具有一等函数的语言通常将所有函数视为闭包,但在简并情况下,它们只是一个空的闭包环境。)

人们经常混淆这两个概念的原因是许多主流语言没有适当的局部函数概念,可以无限制地引用局部变量(即,它们没有闭包)。然后一些人开始引入lambda表达式作为唯一本地函数的正确形式。为了使差异更加清晰,人们明确地谈论“封闭”,以区别于其他残缺的本地功能形式,就像以前在某些主流语言中存在的那样。