On Dec 16, 2011, at 3:59 AM, Carl Howells wrote:

Monoid and Alternative are not the same.  There is a very important
difference between them:

class Alternative f where
   (<|>) :: f a -> f a -> f a
   ...

class Monoid a where
   mappend :: a -> a -> a
   ...

The equivalent to Alternative is MonadPlus, not Monoid.  The kinds
matter.  In Alternative, you are guaranteed that the type that f is
applied to cannot affect the semantics of (<|>).

I understand that one needs to worry about kinds in general, but in this particular case such a subtlety is non-issue because you would always be defining Monad for a particular type.  That is to say, given an alternative f, the instance of Monoid would be

instance Monoid (f a) where { ... }

where in the above a is an arbitrary type variable.

To give you a more concrete example, the following code compiles and runs, producing the output [1,2,3,4,5,6]

================================================

import Data.Monoid

newtype L a = L [a] deriving (Show,Eq)

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

main = putStrLn . show $ (L [1,2,3]) `mappend` (L [4,5,6])

================================================

Cheers,
Greg