Option 1:     Monad( .., mfail, mzero ), MonadPlus( mplus )
  Option 2:   Monad( .., mfail), MonadPlus( mzero, mplus )
  Option 3:   Monad( .., mfail), MonadPlus( mplus ), MonadZero( mzero )

Following Erik's note, I suggest:

  Option 4:  Monad( (>>=), return, mfail)

The user can define MonadZero, MonadPlus, etc. as desired -- we don't
need to specify this in the prelude.  This also means we only need
to come up with a better name for `mfail'.  How about `reject'?

  Option 4':  Monad( (>>=), return, reject)

-- P


Reply via email to