Haskell 这里真的需要装置上的爆炸模式吗?

Haskell 这里真的需要装置上的爆炸模式吗?,haskell,lazy-evaluation,Haskell,Lazy Evaluation,在对Stack进行黑客攻击时,我发现: !()如果有疑问(不要着急),请咨询 表情 do !() <- foo bar 到目前为止,这相当于 let ok = \x -> case x of !() -> bar _ -> fail ... in foo >>= ok do () <- foo bar 现在,它们在GHC用户指南中,因为它是非标准的haskell。在那里我们发现我们可

在对Stack进行黑客攻击时,我发现:

!()如果有疑问(不要着急),请咨询

表情

do !() <- foo
   bar
到目前为止,这相当于

let ok = \x -> case x of !() -> bar
                         _   -> fail ...
in foo >>= ok
do () <- foo
   bar
现在,它们在GHC用户指南中,因为它是非标准的haskell。在那里我们发现我们可以把它改写成

let ok = \x -> x `seq` (case x of () -> bar
                                  _  -> fail ...)
in foo >>= ok
现在就其论点而言⊥ 或者不是。因此,要么
x
是⊥, 但是,
seq
的第二个参数,即……
的案例x也是⊥ 据报道。或者
x
不是⊥,
seq
等于它的第二个参数。在任何一种情况下,上述代码都与相同

let ok = \x -> case x of () -> bar
                         _  -> fail ...
in foo >>= ok
追溯这些步骤,相当于

let ok = \x -> case x of !() -> bar
                         _   -> fail ...
in foo >>= ok
do () <- foo
   bar
(其中,
foo
将永远不会被评估)以及


因为let表达式在.

中有特殊规定,因为
()
已经是正常形式(因此,在WHNF中),我认为使用bang模式没有任何意义,这里。构造函数模式之前的爆炸是没有意义的——我们无论如何都在强制值。对repo的一些调查显示,这种爆炸模式是由Michael Snoyman在年引入的。也许你应该把你的问题贴在回购协议的问题追踪者上,问他写这篇文章时的想法。迈克尔知道他的东西,所以我想说他只是因为疏忽而留下了这个多余的爆炸。也许这只是为了让人们更清楚地看到,正在进行一次强制评估?
let !() = foo
in bar