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