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