rad*_*row 5 haskell lazy-evaluation ghci
我理解a `seq` b为"严格对a和计算b",所以undefined `seq` True抛出和异常.
我正在玩,:sprint并尝试在ghci中进行以下测试:
Prelude> x = [True, undefined]
Prelude> :sprint x
x = _
Run Code Online (Sandbox Code Playgroud)
好的,因为x尚未计算
Prelude> x `seq` True
True
Prelude> :sprint x
x = _
Run Code Online (Sandbox Code Playgroud)
为什么x = _在这一刻呢?我认为这seq将x至少评估_:_(或更可能True:_),但其价值仍然完全潜伏.它需要以某种方式检查是否x不是undefined,所以它需要执行一种评估,但为什么不保持结果呢?
我正在使用GHC 8.6.3
好的,我在 trac 上开了一张票(链接: https: //ghc.haskell.org/trac/ghc/ticket/16089),这似乎是与另一个票相关的错误(https://ghc.haskell.org /trac/ghc/ticket/16096)。
\n\n问题是如何在 GHCi \xe2\x80\x93 中处理x = y和的结果let x = y,第一个被解释为顶级绑定(默认情况下关闭单态限制),第二个被let解释为do块中的语句。此问题暗示了一些其他不需要的行为,例如-Wall打开时缺少阴影警告。您可以在此线程中检查此问题的修复:https ://phabricator.haskell.org/D5473