闭包(在Haskell中)

时间:2012-01-31 22:56:53

标签: haskell closures

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

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

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

2 个答案:

答案 0 :(得分:26)

在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中并不特别,并且一直在使用。

答案 1 :(得分:3)

通常,如果我需要为函数预先计算表或某些东西,或者有一个需要大量数据的函数,是的,这将作为一个闭包来完成。例如,前几天在我的AI作业中,我写了一个从大量样本中学到的东西,然后弹出(Point -> Bool)函数,但该函数必须依赖于我积累的大量数据从学习过程。