[Haskell-cafe] Re: what is inverse of mzero and return?

Jorge Adriano Aires jadrian at mat.uc.pt
Sun Jan 23 09:58:56 EST 2005


> >>What would happen if this was the definition?
> >>
> >>instance MonadPlus [] where
> >>   mzero = []
> >>   mplus a b
> >>
> >>       | a == [] = b
> >>       | otherwise = a
>
> Isn't the above a monoid as well?

Yes.

> Is there only on correct definition of a monad/monoid on lists - or does
> anything that satisfies the monad laws count? I got the impression you
> could define anthing you liked for mzero and mplus - providing the laws
> are upheld?

I'm not arguing that definition would be "wrong". It is a monoid. This is the 
instance for ():

instance MonadPlus() where
  mzero = ()
  mplus a b = ()


And this would be "correct" too:

instance MonadPlus Maybe where
  mzero = Nothing
  mplus a b = Nothing

instance MonadPlus [] where
  mzero = []
  mplus a b = []

Which are not really useful. I'm claiming that the fact that Maybe is a 
trivial Monoid doesn't mean we should "dumb" down other instances, like the 
one on lists. The usual definition of Monoid on lists is [] as identity and 
++ as the monoid operation. That is how it's defined  in class monoid, and I 
expect this relation to hold:

instance MonadPlus m => Monoid (m a) where
   mempty = mzero
   mappend = mplus


> >Then, I'd say you're not thinking of monadic sums, but of catching errors,
> > and the appropriate place for that is the class MonadError.
>
> I am thinking about how some monads are summed - like Maybe and
> the Parser monad.

But, this is not how monadic parsers are summed. Just look into the instace of 
MonadError for Text.ParserCombinators.ReadP.P. Again it would be the case for 
parsers that would return just one possible parsing, but not for parsers that 
return [(a,String)].

J.A.



More information about the Haskell-Cafe mailing list