This is one of the shortcomings of haskell not to mention other programming languages. Mathemathicist would find it very annoying.

Instead of 

instance Monoid Integer where
mappend = (+)
mempty = 0
instance Monoid Integer where
mappend = (*)
mempty = 1

which is not legal and the workaround
Num a => Monoid (Sum a)
Num a => Monoid (Product a)
wich is cumbersome
A mathematician  would say something like:
instance Monoid Integer with operation + where
    mappend = (+)
mempty = 0
and
instance Monoid Integer with operation * where
mappend = (*)
mempty = 1

But talking about shortcomings, personally I prefer to implement first a form of assertion that permits the checking of the  class properties automatically for each new instance. 
 
This is far more important in práctical terms.


2009/1/19 Thomas DuBuisson <thomas.dubuisson@gmail.com>
2009/1/19 Luke Palmer <lrpalmer@gmail.com>:
> On Mon, Jan 19, 2009 at 3:58 AM, Patai Gergely <patai_gergely@fastmail.fm>
> wrote:
>>
>> However, there are other type classes that are too general to assign
>> such concrete uses to. For instance, if a data structure can have more
>> than one meaningful (and useful) Functor or Monoid instance,
>
> As a side curiosity, I would love to see an example of any data structure
> which has more than one Functor instance.  Especially those which have more
> than one useful functor instance.
> Luke

The recent, and great, blog post about moniods [1] discusses the fact
that (Num a) could be one of several different monoids and how that
was handled.

[1] http://sigfpe.blogspot.com/2009/01/haskell-monoids-and-their-uses.html
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe