实例MonadPlus IO
是唯一的,因为mzero
抛出:
Prelude Control.Monad> mzero
*** Exception: user error (mzero)
因此,MonadPlus IO
意味着它也适用于错误。
mzero
如果其他动作不抛出,显然用作标识元素:
Prelude Control.Monad> mzero `mplus` return 0
0
Prelude Control.Monad> return 0 `mplus` mzero
0
但是当两个动作都抛出时它不会:
Prelude Control.Monad> fail "Hello, world!" `mplus` mzero
*** Exception: user error (mzero)
Prelude Control.Monad> mzero `mplus` fail "Hello, world!"
*** Exception: user error (Hello, world!)
所以MonadPlus IO
不是幺半群。
如果MonadPlus
在用户意图错误时违反法律,那么它的实际目的是什么?