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