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

为什么lambda不是闭包,反之亦然?,lambda,functional-programming,closures,Lambda,Functional Programming,Closures,我一直试图得到这个问题的答案有一段时间了,但我找不到任何能让我信服的东西。有人知道这件事的最后一句话吗?有没有简单明了的例子?顺便说一下,我已经看到了这个问题: 我找到了非常有趣的答案,但当我问到我原来的问题时,我就更加困惑了 我非常感谢您的帮助。事实上,许多人都感到困惑,包括您链接的问题答案中的一些人 让我重申我的答案:lambda是(匿名)函数表达式的语言构造,闭包是使局部函数成为一流的实现技术 例如,在函数式语言中,命名函数定义 f x = x + 1 (* 1

我一直试图得到这个问题的答案有一段时间了,但我找不到任何能让我信服的东西。有人知道这件事的最后一句话吗?有没有简单明了的例子?顺便说一下,我已经看到了这个问题:

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


我非常感谢您的帮助。

事实上,许多人都感到困惑,包括您链接的问题答案中的一些人

让我重申我的答案:lambda是(匿名)函数表达式的语言构造,闭包是使局部函数成为一流的实现技术

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

f x = x + 1              (* 1 *)
通常只是lambda表达式的缩写:

f = lambda x => x + 1    (* 2 *)
let f x = x + 1 in f
(反之亦然,lambda可被视为辅助局部定义的缩写,例如

lambda x => x + 1
等效于let表达式:

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

换句话说,lambda仅仅是语法,它们并不意味着语义本身

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

g x = let h y = x + y in h    (* 3 *)
或相当于:

g x = lambda y => x + y       (* 4 *)
(函数式语言甚至允许将后者缩写为

g x y = x + y
)

这里,内部函数指的是外部函数的局部变量(参数
x
)。像
g2
这样的表达式将返回一个函数,但该函数的内部表示不能仅仅由
h
的“code”组成,它还必须包含
x=2
的信息。后者称为闭包环境,闭包环境和“代码”对称为“闭包”。名称来自数学:函数对象在其环境上“关闭”(外部作用域中的名称),从自包含实体的意义上讲。在实现中,这一点很重要,以便允许这些函数作为独立值持久存在,即使在周围调用很长时间后仍然返回

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


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

你说的是哪种语言。我不知道有哪种语言的闭包中lambda不是闭包。@sepp2k它们并不完全相同。lambda表达式是代码。闭包是词汇范围语言中经过计算的lambda表达式(运行时对象)。@sepp2k我说的是一般的函数式编程,不是特定的语言。lambda表达式只是代码,而经过计算的lambda表达式则是词汇范围语言中的闭包。使用动态范围语言,您可以得到在计算时不是闭包的函数对象。因此,创建函数时可用的变量在调用函数时可能不存在。