我将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
答案 0 :(得分:1)
好的,我在Trac上做了一张票(链接:https://ghc.haskell.org/trac/ghc/ticket/16089),这似乎是与另一个错误有关的错误(https://ghc.haskell.org/trac/ghc/ticket/16096)。
问题是由于在GHCi中如何处理x = y
和let x = y
的结果–第一个被解释为顶级绑定(默认情况下关闭了同构限制),第二个被解释为{{1 }}语句在let
块中。此问题暗示了其他一些不良行为,例如打开do
时缺少阴影警告。您可以在以下线程中对此问题进行检查:https://phabricator.haskell.org/D5473