在研究并行编程以及随后的评估策略时,出现了 thunk 是否可变的问题。举个例子,假设我有以下代码:
foo = 1 + 2 -- Thunk
bar = foo `seq` foo -- Evaluates foo
seq
在评估bar
评估时调用foo
,给出bar
正常形式的值3
。这个评价也有影响foo
吗?也就是说,是foo
仍然1+2
还是3
经过评估后的价值bar
?
在研究并行编程以及随后的评估策略时,出现了 thunk 是否可变的问题。举个例子,假设我有以下代码:
foo = 1 + 2 -- Thunk
bar = foo `seq` foo -- Evaluates foo
seq
在评估bar
评估时调用foo
,给出bar
正常形式的值3
。这个评价也有影响foo
吗?也就是说,是foo
仍然1+2
还是3
经过评估后的价值bar
?
foo
并且bar
是Constant Applicative Forms,其中(引用链接):
...可以编译为所有用途共享的图形,也可以编译为某些共享代码,该代码将在第一次评估时用某个图形覆盖自身。
这句话的第二部分对应懒惰的评估,其中评估foo
后将是 3 bar
。第一部分更笼统(没有说明共享图会发生什么),因此它留下了重新评估foo
.