haskell - Haskell 中的所有内容都存储在 thunk 中吗,甚至是简单的值?

标签 haskell lazy-evaluation thunk

以下值/表达式/函数的 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 中的表示方式,那就太好了。

最佳答案

官方答复

这不关你的事。编译器的严格实现细节。

简短回答

是的。

更长的答案

对于 Haskell 程序本身来说,答案总是肯定的,但是如果编译器发现它可以摆脱它,出于性能原因,它可以并且将会做不同的事情。

例如,对于“add x y = x + y”,编译器可能会生成与 x 和 y 的 thunk 配合使用的代码,并最终构造一个 thunk。 但请考虑以下几点:

foo :: Int -> Int -> Int
foo x y = x * x + y * y

这里,优化编译器将生成代码,首先将 x 和 y 从它们的盒子中取出,然后执行所有算术运算,然后将结果存储在一个盒子中。

高级答案

本文描述了 GHC 如何从一种实现 thunk 的方式切换到另一种实际上更简单、更快的方式: http://research.microsoft.com/en-us/um/people/simonpj/papers/eval-apply/

关于haskell - Haskell 中的所有内容都存储在 thunk 中吗,甚至是简单的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8478412/

相关文章:

javascript - 为什么我的 redux 状态没有更新

haskell - 为什么 Fractional 类型类在 Haskell 中本质上不是可排序的?

list - 如何阅读这份 list ?

用于大量条目的 C# LazyList

haskell - 测试一个值是否已被评估为弱头范式

ios - Swift - App store reject - 部分应用转发器以重新抽象 thunk helper

list - 以所有可能性在 Haskell 中旋转列表

haskell - Haskell副产品和数据记录字段限制

user-interface - 在 REPL 中计算函数的结果与在程序中计算函数的结果不同

racket - 如何延迟/延迟评估 Racket 中函数的参数?