8

当我map (1+) list在 Haskell 中编写类似的东西时,内部表示是(1+)什么?由于它是 的部分应用(+),因此必须将参数1保存在某个地方,但我无法理解这一点。有人可以给我一个简短的解释,如何实现柯里化和部分应用?

4

3 回答 3

10

部分应用的函数(实际上,Haskell 堆中的几乎所有其他函数)都表示为闭包——一个结合了代码指针和参数槽的结构。具体来说,我们将未采用完全评估形式的值称为thunk

请参阅有关盒装数据的较早问题和有关如何表示 thunk的 GHC 手册。

于 2011-04-03T19:05:18.890 回答
7

可以这样想: 一切都由一段代码(“thunk”)表示,必须直接调用才能获得结果。当你写一个字面1量时,它会被编译成一段代码,fromIntegral 1在调用时返回 1(实际上是 ),然后用那段代码代替字面量 1。这也是懒惰的关键:而不是计算一些东西立即创建一个 thunk,调用时将执行计算。如果将该表达式传递给另一个函数,则传递的是包装器 thunk,因此计算不会发生,直到/除非某些事情需要明确检查其结果。

在 Haskell 中,函数应用程序以相同的方式表示:处理一个参数并返回一个处理下一个参数或产生结果的 thunk。(1+)函数 application也是如此(+) 1(+)是一个期望传递一个数字并返回一个期望传递另一个数字的 thunk 的 thunk。由于(+)是严格的,第二个 thunk 实际上会执行加法,而不是返回一个必须调用才能进行实际加法的 thunk。因此(1+)计算为第二个 thunk,它需要使用另一个数字来调用,该数字将在map迭代时提供list

于 2011-04-03T18:37:07.827 回答
3

您可能还想查看实现函数式语言:教程,Simon Peyton Jones 和 David Lester 的一本书。

于 2011-04-04T17:09:38.613 回答