以下值/表达式/函数的 thunk 在 Haskell 堆中是什么样子的?
val = 5 -- is `val` a pointer to a box containing 5?
add x y = x + y
result = add 2 val
main = print $ result
考虑到 Haskell 的惰性求值模式,如果能够了解这些在 Haskell 中的表示方式,那就太好了。
官方解答
这不关你的事。编译器的严格实现细节。
简短回答
Yes.
更长的答案
对于 Haskell 程序本身来说,答案总是肯定的,但是如果编译器发现它可以摆脱它,出于性能原因,它可以并且将会做不同的事情。
例如,对于“add x y = x + y”,编译器可能会生成与 x 和 y 的 thunk 一起使用的代码,并最终构造一个 thunk。
但请考虑以下事项:
foo :: Int -> Int -> Int
foo x y = x * x + y * y
在这里,优化编译器将生成代码,首先将 x 和 y 从盒子中取出,然后执行all算术,然后将结果存储在一个框中。
高级答案
本文描述了 GHC 如何从一种实现 thunk 的方式切换到另一种实际上更简单、更快的方式:http://research.microsoft.com/en-us/um/people/simonpj/papers/eval-apply/ http://research.microsoft.com/en-us/um/people/simonpj/papers/eval-apply/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)