在研究并行编程以及随后的评估策略时,出现了 thunk 是否可变的问题。举个例子,假设我有以下代码:

foo = 1 + 2         -- Thunk
bar = foo `seq` foo -- Evaluates foo

在计算 seq 时调用 bar 会计算 foo ,从而为 bar 提供标准形式值 3 。此评估是否也会影响 foo?也就是说, foo 的值仍然是 1+2 还是 3 求值后的 bar

最佳答案

Haskell 报告仅指定评估顺序为 "non-strict" ,因此任一行为都符合标准。

但是,使用 lazy ( "call by need" ) 评估(涉及以一种使 thunk 如您所描述的“可变”的方式共享值)提供了对 "call by name" 的渐进改进(即不共享)。

因此,在 GHC(可能还有大多数其他合理的实现)中,foo 在您第一次强制后将变为 3。但是,这不是标准规定的,您应该牢记这一点。

关于haskell - Haskell thunk 在评估方面是否可变?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11094242/

10-13 06:05
查看更多