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

:sprint and `seq` together - missing evaluation?

我理解 a `seq` b 为 "be strict on a and compute 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 是否不是 undefined,因此它需要执行某种评估,但为什么不保留结果?

我正在使用 GHC 8.6.3

好的,我在 trac 上开了个票 (link: https://ghc.haskell.org/trac/ghc/ticket/16089) and it seems to be a bug related to another one (https://ghc.haskell.org/trac/ghc/ticket/16096)。

问题是 GHCi 如何处理 x = ylet x = y 的结果——第一个被解释为顶层绑定(默认情况下关闭单态限制),第二个被解释为 let do 块中的语句。此问题暗示了一些其他不需要的行为,例如在 -Wall 开启时缺少阴影警告。您可以在此线程中检查此问题的修复:https://phabricator.haskell.org/D5473