在研究并行编程以及随后的评估策略时,出现了 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/