这里是评估文档的摘录: (参见http://hackage.haskell.org/packages/archive/base/4.5.0.0/doc/html/Control-Exception-Base.html#v:evaluate)
evaluate x
与
不同return $! x
正确的定义是
evaluate x = (return $! x) >>= return
我不明白这两个定义之间的语义差异...... 有人可以帮助我吗? 提前谢谢!
答案 0 :(得分:19)
快速参考:
evaluate
的类型是:
evaluate :: a -> IO a
seq
的类型为a -> b -> b
。它首先计算第一个参数,然后返回第二个参数。
评估遵循以下三条规则:
evaluate x `seq` y ==> y
evaluate x `catch` f ==> (return $! x) `catch` f
evaluate x >>= f ==> (return $! x) >>= f
使用以下表达式可以明显区分return $! x
和(return $! x) >>= return
:
evaluate undefined `seq` 42
根据第一条规则,必须评估为42。
使用return $! x
定义,上面的表达式会导致未定义的异常。它的值为⊥,不等于42。
使用(return $! x) >>= return
定义,它确实等于42。
基本上,当计算IO值时,return $! x
形式是严格的。另一种形式仅在运行IO值时使用严格且使用的值(使用>>=
)。
有关详细信息,请参阅this mailing list thread。