由於shown in this answer,seq
結合undefined
在等式推理方面做了很奇怪的事情,例如它可以使任何monad失敗。另一個例子是this question。與`seq`相比``評估'安全嗎?
最近我偶然發現了evaluate :: a -> IO a
做了類似的事情 - 它評估它的參數到WHNF,但只有當IO
行動被評估。這似乎更安全了,因爲人們期望「在IO
我們可以做所有事情」。當然,它無法在任何地方使用,但通常需要評估一個表達式與某種操作相關(例如,在使用MVar
s時,強制生成的線程評估計算而不是消耗線程)。
所以我想問一下,evaluate
有多安全?是否有可能創建示例(當然涉及IO
),它破壞了有關像seq
這樣的代碼的推理?或者我可以將其視爲安全替代seq
(如果某個特定程序可能)?