【发布时间】:2012-03-22 04:11:57
【问题描述】:
这是evaluate文档的摘录:
Control.Exception.Base.evaluate :: a -> IO a
evaluate x不一样
return $! x正确的定义是
evaluate x = (return $! x) >>= return
(source)
这些似乎具有相同的含义。这两个定义有什么区别?
【问题讨论】:
-
这真的不违反单子定律吗?
-
@leftaroundabout 不,它没有。如果运行,两者的行为完全相同,但如果你
seq表达式,return $! x有一个seq最外层,而(return $! x) >>= return有一个(>>=)最外层。 -
@leftaroundabout:不,因为出于法律目的,⊥ 被忽略。像
Reader这样的标准 monad 的行为方式相同。 (我不认同 Daniel Fischer 的论点(我以前从其他人那里听说过),因为“如果运行,行为完全相同”并不是一个定义明确的概念。) -
@DanielFischer 我不确定您的陈述是否正确。
`seq`的优先级低于>>=->>=怎么可能是最外层的? -
@mucaho 我说的是两个表达式,它们将成为
seq的参数。在seq (return $! x)中,return $! x在最外面有一个seq[来自$!],而在seq ((return $! x) >>= return)中,(return $! x) >>= return在最外面有一个>>=。
标签: haskell io monads evaluation io-monad