:sprint和`seq`在一起-缺少评估?

时间:2018-12-22 18:19:02

标签: haskell lazy-evaluation ghci

我将a `seq` b理解为“严格限制a并计算b”,因此undefined `seq` True抛出异常。

我正在玩:sprint,并尝试在ghci中进行以下测试:

Prelude> x = [True, undefined]
Prelude> :sprint x
x = _

好的,因为尚未计算x

Prelude> x `seq` True
True
Prelude> :sprint x
x = _

为什么此时x = _?我认为seq至少会对x(或更可能是_:_)进行评估,但其价值仍然是完全潜在的。它需要以某种方式检查True:_是否不是x,因此它需要执行某种评估,但是为什么不保留结果呢?

我正在使用GHC 8.6.3

1 个答案:

答案 0 :(得分:1)

好的,我在Trac上做了一张票(链接:https://ghc.haskell.org/trac/ghc/ticket/16089),这似乎是与另一个错误有关的错误(https://ghc.haskell.org/trac/ghc/ticket/16096)。

问题是由于在GHCi中如何处理x = ylet x = y的结果–第一个被解释为顶级绑定(默认情况下关闭了同构限制),第二个被解释为{{1 }}语句在let块中。此问题暗示了其他一些不良行为,例如打开do时缺少阴影警告。您可以在以下线程中对此问题进行检查:https://phabricator.haskell.org/D5473