
It sounds like the semantics of the MonadPlus methods are
under-specified. I recall once writing a newtype wrapper to treat the
same non-determinism monad with different mplus semantics, akin to cut
versus backtracking.
I think of MonadPlus as a less expressive version of msplit, from
Backtracking, Interleaving, and Terminating Monad Transformers
The Functional Pearl paper by Oleg Kiselyov, Chung-chieh Shan,
Daniel P. Friedman and Amr Sabry. ICFP 2005.
Is that an over-simplification?
On Fri, May 9, 2008 at 3:12 PM, Bryan O'Sullivan
Andrew Coppin wrote:
...so it's a kind of choice operator? Run all actions until you get to one that succeeds and return the result from that?
In the context of Parsec, yes. In the grander scheme of things, the behaviour depends on whatever is appropriate for the particular monad you're working in.
So, for example, mplus for lists is (++) and mzero is [], which is quite a different set of behaviours from the Parsec case. Usually, you can rely on MonadPlus behaving like a monoid. There are occasional exceptions, which is a mite upsetting.
http://www.haskell.org/haskellwiki/MonadPlus
http://www.haskell.org/mailman/listinfo/haskell-cafe