3

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

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

seq在评估bar评估时调用foo,给出bar正常形式的值3。这个评价也有影响foo吗?也就是说,是foo仍然1+2还是3经过评估后的价值bar

4

2 回答 2

8

Haskell 报告仅指定评估顺序是“非严格的”,因此任何一种行为都符合标准。

但是,使用惰性“按需要调用”)评估,它涉及以一种使 thunk 如您所描述的那样“可变”的方式共享值,提供了对“按名称调用”(即不共享)的渐近改进。

因此,在 GHC(以及可能大多数其他合理的实现)中,foo3在您第一次强制它之后变为。但是,这不是标准强制要求的,您应该牢记这一点。

于 2012-06-19T04:37:27.203 回答
1

foo并且barConstant Applicative Forms,其中(引用链接):

...可以编译为所有用途共享的图形,也可以编译为某些共享代码,该代码将在第一次评估时用某个图形覆盖自身。

这句话的第二部分对应懒惰的评估,其中评估foo后将是 3 bar。第一部分更笼统(没有说明共享图会发生什么),因此它留下了重新评估foo.

于 2012-06-19T14:37:41.403 回答