闭包(在Haskell中)

J F*_*sch 14 closures haskell

对我来说,Closure是一个(嵌套?)函数,具有共同定位的数据.

当您在Haskell中编写软件并在之后查看它时,您经常会发现无意中创建的闭包.

我不太适合自己.在什么情况下我会故意想要编码闭包?毕竟,在所有的例子中,我发现共同定位数据的数量是微不足道的,因此在我看来并不像在实践中那样可以证明他们(有意)的创造是合理的.是否有任何Haskell模块可以帮助我有意创建闭包并将其存储在地图中?

dfl*_*str 29

在Haskell中,函数是语言的重要组成部分,主要是因为Haskell基于Lambda微积分.

在Lambda微积分中,有些函数具有"自由变量",这意味着它们使用未作为直接参数传递给它们的变量.具有自由变量的函数在这种情况下称为"闭包".

因为具有自由变量的函数在LC中非常常见,所以它们也构成了Haskell语言的组成部分.例如,当你写这个:

f a b c = a * b + c
Run Code Online (Sandbox Code Playgroud)

...你也可以写这个,结果完全相同:

f a b = \ c -> a * b + c
Run Code Online (Sandbox Code Playgroud)

... 甚至:

f a b = let product = a * b in \ c -> product + c
Run Code Online (Sandbox Code Playgroud)

...进一步的等效变化:

f a = \ b -> let product = a * b in \ c -> product + c
Run Code Online (Sandbox Code Playgroud)

这是因为Haskell实际上在任何地方都创建了带有自由变量的函数,因此,一直在创建闭包.其中一些可能会被编译器优化掉,但可以安全地假设使用的闭包比你自己能够发现的更多.

所以,不要试图找到闭包; 它们在Haskell中并不特别,并且一直在使用.