如this answer所示,在等式推理方面seq
结合使用undefined
会做非常奇怪的事情,例如它可以使任何单子失败。另一个例子是在这个问题中。
最近我偶然发现evaluate :: a -> IO a
它做了类似的事情 - 它评估它对 WHNF 的论点,但仅在IO
评估动作时。这似乎更安全,因为人们期望“IO
我们可以做任何事情”。当然,它不能在任何地方使用,但通常需要评估表达式以某种方式与IO
操作相关(例如在使用 s 时强制生成线程评估计算而不是消费线程MVar
)。
所以我想问一下,安全性如何evaluate
?是否有可能创建示例(IO
当然涉及)它打破了对代码的推理seq
?或者我可以将其视为seq
(如果特定程序可能的话)的安全替代品吗?