Ashley Yakeley ashley at
Thu Oct 27 00:55:07 EDT 2005

In article <20051024094010.GA4888 at>,
 Ross Paterson <ross at> wrote:

> To recap: with Haskell's class system, we can have only one (->) instance,
> so we have to choose.

There are many possibilities:

  instance Monoid [a] where
    mempty = []
    mappend = (++)

  instance Monoid (a -> a) where
    mempty  = id
    mappend = (.)

  instance Monoid b => Monoid (a -> b) where
    mempty _ = mempty
    mappend f g x = f x `mappend` g x

  instance Monad m => Monoid (m ()) where
    mempty = return ()
    mappend = (>>)

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

  instance Arrow arr => Monoid (arr p p) where
    mempty = arr id
    mappend = (>>>)

  instance Monoid a => Monoid a where
    mempty = mempty
    mappend p q = mappend q p

OK, so the last one's silly. But maybe Monoid should be a datatype 
rather than a class?

Ashley Yakeley, Seattle WA

More information about the Libraries mailing list