小编and*_*e_c的帖子

共享无点功能,但评估两次

我一直在尝试了解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)

haskell lazy-evaluation ghci

15
推荐指数
1
解决办法
158
查看次数

标签 统计

ghci ×1

haskell ×1

lazy-evaluation ×1