fuz*_*fuz 8 haskell currying partial-application internal-representation
当我map (1+) list在Haskell中编写类似内容时,内部表示是(1+)什么?由于它是部分应用(+),争论1必须在某处保存,但我无法理解这一点.有人可以给我一个简短的解释,如何实现currying和部分应用程序?
Don*_*art 10
部分应用的函数(实际上,几乎Haskell堆中的其他所有函数)都表示为闭包 - 一种组合代码指针和参数槽的结构.具体来说,我们称之为不是完全评估形式thunks的值.
请参阅前面关于盒装数据的问题以及关于如何表示thunks的GHC手册.
可以这样想: 一切都由一大块代码(一个"thunk")表示,必须直接调用才能获得结果.当你编写一个文字时1,它被编译成一个代码块,fromIntegral 1在调用时返回1(实际上),然后用那个代码块代替文字1.这也是懒惰的关键:而不是计算某些东西立即创建一个thunk,当被调用时将进行计算.如果将该表达式传递给另一个函数,则它是传递的包装器thunk,因此除非需要明确检查其结果,否则计算不会发生.
在Haskell中,函数应用程序以相同的方式表示:一个thunk,它处理一个参数并返回一个thunk,它处理下一个参数或产生结果.(1+)函数应用程序也是如此(+) 1: (+)是一个希望传递一个数字并返回一个期望传递另一个数字的thunk的thunk.由于(+)是严格的,第二个thunk实际上是添加而不是返回必须被调用以进行实际添加的thunk.因此,(1+)计算第二个thunk,需要使用另一个数字调用,该数字将在map迭代时提供list.
| 归档时间: |
|
| 查看次数: |
456 次 |
| 最近记录: |