"评估"功能

HNo*_*oob 23 io monads evaluation haskell io-monad

这里是评估文档的摘录:(参见http://hackage.haskell.org/packages/archive/base/4.5.0.0/doc/html/Control-Exception-Base.html#v:evaluate)

Control.Exception.Base.evaluate :: a -> IO a
Run Code Online (Sandbox Code Playgroud)

是不一样的

evaluate x
Run Code Online (Sandbox Code Playgroud)

一个正确的定义是

return $! x
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ani 21

快速参考:

类型evaluate是:

evaluate :: a -> IO a
Run Code Online (Sandbox Code Playgroud)

seq有类型a -> b -> b.它首先计算第一个参数,然后返回第二个参数.

评估遵循以下三个规则:

evaluate x `seq` y    ==>  y
evaluate x `catch` f  ==>  (return $! x) `catch` f
evaluate x >>= f      ==>  (return $! x) >>= f
Run Code Online (Sandbox Code Playgroud)

的之间的差return $! x(return $! x) >>= return与此表达变得明显:

evaluate undefined `seq` 42
Run Code Online (Sandbox Code Playgroud)

根据第一条规则,必须评估为42.

根据return $! x定义,上面的表达式将导致未定义的异常.它的值为⊥,不等于42.

根据(return $! x) >>= return定义,它确实等于42.

基本上,在return $! x计算IO值时,表单是严格的.另一种形式仅在运行IO值时使用严格且使用的值(使用>>=).

有关详细信息,请参阅此邮件列表主题.