haskell - 闭包(在 Haskell 中)

标签 haskell closures

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

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

我并不完全适合自己。在什么情况下我会故意编写闭包代码?毕竟,在所有示例中,我发现位于同一位置的数据量很小/很小,因此在我看来,在实践中似乎并不能证明他们的(有意)创建是合理的。是否有任何 Haskell 模块可以支持我故意创建闭包,例如将它们存储在 map 中?

最佳答案

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

在 Lambda 演算中,有些函数具有“自由变量”,这意味着它们使用未作为直接参数传递给它们的变量。在这种情况下,具有自由变量的函数就是您所说的“闭包”。

因为带有自由变量的函数在 LC 中很常见,它们也构成了 Haskell 语言的一个组成部分。例如,当您编写此代码时:

f a b c = a * b + c

...你也可以写这个,结果完全相同:
f a b = \ c -> a * b + c

... 甚至:
f a b = let product = a * b in \ c -> product + c

...进一步等效更改:
f a = \ b -> let product = a * b in \ c -> product + c

这是因为 Haskell 本质上创建了到处都有自由变量的函数,因此,闭包一直在创建。其中一些可能会被编译器优化掉,但可以肯定的是,使用的闭包比你自己发现的要多。

所以,不要试图定位闭包;它们在 Haskell 中没有什么特别之处,并且一直在使用。

关于haskell - 闭包(在 Haskell 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9088295/

相关文章:

objective-c - 转义闭包是如何在 Swift 3 中实现的(底层)?它们是否像在 objective-c 中那样隐式地 block_copied/retained?

javascript - for循环内部的值覆盖循环外部的数据

javascript - 如何在递归函数中使用闭包而不丢失 JavaScript 的作用域?

javascript - Closure JavaScript(简单)计数器的不同输出

haskell - 应用(和 friend )方法是否有人性化的名称?

haskell - Cabal 无法安装软件包,因为它需要 cabal

haskell - optparse-applicative : Generate usage information with custom error message from options definition

haskell - Haskell 中的可选参数

haskell - 让 Gloss 在 Haskell 中工作

javascript - 我需要 Javascript 闭包吗?