Haskellのモナド3(3)
MonadPlusのインスタンスは、モナドのインスタンスがモナド則を満たす必要があるのと同様に、いくつかの法則を満たさなくてはなりません。残念ながら、これらの法則はまだ確定していません。ただ、確実に必要なのが、mzeroとmplusがモノイドを形成することで、すなわち、
mzero `mplus` m = m m `mplus` mzero = m m `mplus` (n `mplus` o) = (m `mplus` n) `mplus` o
Control.Monadでは、次の法則が追加されています。
mzero >>= f = mzero m >> mzero = mzero
Haskell Wikiでは他に以下が追加されています。
(m `mplus` n) >>= k = (m >>= k) `mplus` (n >>= k)
実際にはこの他にもいろいろな法則があるため、IOがMonadPlusとして扱われているようなモナドを見るかもしれません。All About MonadsやHaskell WikiのMonadPlusあたりを見ればそのへんの情報が載っています。