我一直在尝试了解Haskell中共享计算的工作原理。根据我的理解,无点共享计算应该只进行一次评估(由CSE提供)。
(A)例如,考虑以下代码及其输出:
*Main> let foo = trace "eval foo" 5 in foo + foo
eval foo
10
*Main> let foo' = \x -> trace "eval foo'" x in (foo' 5) + (foo' 5)
eval foo'
eval foo'
10
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,foo仅被评估一次(CSE可能会启动),而foo'被懒惰地评估两次。那样就好。我使用GHCi 7.6.3版尝试了上述方法。接下来,我在GHCi版本8.6.5中尝试了相同的代码,而是产生了以下结果:
*Main> let foo = trace "eval foo" 5 in foo + foo
eval foo
eval foo
10
Run Code Online (Sandbox Code Playgroud)
请注意,该foo值现在已评估两次。
(B)同样,对于GHCi版本7.6.3:
*Main> let goo = const (trace "eval goo" 5) in goo () + …Run Code Online (Sandbox Code Playgroud)