Haskell 这里真的需要装置上的爆炸模式吗?
在对Stack进行黑客攻击时,我发现: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。在那里我们发现我们可
!()如果有疑问(不要着急),请咨询
表情
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