"评价"功能

时间:2012-03-04 09:59:56

标签: haskell

这里是评估文档的摘录: (参见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

我不明白这两个定义之间的语义差异...... 有人可以帮助我吗? 提前谢谢!

1 个答案:

答案 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