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)
Run Code Online (Sandbox Code Playgroud)Control.Exception.Base.evaluate :: a -> IO a
是不一样的
Run Code Online (Sandbox Code Playgroud)evaluate x
一个正确的定义是
Run Code Online (Sandbox Code Playgroud)return $! x
我不明白这两个定义之间的语义差异......是否有人可以帮助我?提前致谢!
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值时使用严格且使用的值(使用>>=
).
有关详细信息,请参阅此邮件列表主题.
归档时间: |
|
查看次数: |
3028 次 |
最近记录: |