[Haskell-cafe] monoids and monads

Edward Kmett ekmett at gmail.com
Mon Jul 26 12:02:47 EDT 2010

On Mon, Jul 26, 2010 at 11:55 AM, John Lato <jwlato at gmail.com> wrote:

> Hello,
> I was wondering today, is this generally true?
> instance (Monad m, Monoid a) => Monoid (m a) where
>  mempty = return mempty
>  mappend = liftM2 mappend

> I know it isn't a good idea to use this instance, but assuming that
> the instance head does what I mean, is it valid?  Or more generally is
> it true for applicative functors as well?  I think it works for a few
> tricky monads, but that's not any sort of proof.  I don't even know
> how to express what would need to be proven here.

There are multiple potential monoids that you may be interested in here.

There is the monoid formed by MonadPlus, there is the monoid formed by
wrapping a monad (or applicative) around a monoid, which usually forms part
of a right seminearring because of the left-distributive law, there are also
potentially other monoids for particular monads.

See the monad module in my monoids package:


> Any resources for how I could develop a means to reason about this
> sort of property?

The types are not enough.

What you need is the associativity of Kleisli arrow composition and the two
identity laws.

The three monad laws are precisely what you need to form this monoid. There
are analogous laws for Applicative that serve the same purpose.

-Edward Kmett
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20100726/108eceaa/attachment.html

More information about the Haskell-Cafe mailing list