【发布时间】:2019-08-11 06:26:48
【问题描述】:
实例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 法律,那么它的实际意图是什么?
【问题讨论】:
-
请注意,
fail并非用于引发错误的通用方法;这是do表示法和列表推导中模式匹配失败的实现细节。
标签: haskell error-handling io monoids monadplus