
On Sun, 2007-01-21 at 09:42 -0800, Stefan O'Rear wrote:
On Sun, Jan 21, 2007 at 06:21:34PM +0100, Hans van Thiel wrote:
class (Num a, Monoid a) => NumMon a where e = 0 add x y = x + y
What am I doing wrong? Many thanks in advance.
Nothing!
What you are trying to do, declare a class B containing all members of a class A, is simply not supported in Haskell.
This is the closest you'll get with Haskell98:
newtype Wrap a = Wrap (Wrap a) instance Num a => Monoid (Wrap a) where e = Wrap 0 add (Wrap x) (Wrap y) = Wrap (x + y)
This is the closest you'll get with GHC extensions:
{-# OPTIONS_GHC -fallow-undecidable-instances #-} instance Num a => Monoid a where e = 0 add = (+)
Hope this helps. Yes, thank you. The one with the gHC extension looks like what I wanted to do, but then in reverse order, declare the numbers to be monoids. Expanding on this, I've now got:
class Monoid a => Group a where inv :: a -> a minus :: a-> a -> a minus x y = add x (inv y) inv x = minus e x instance Group Int where minus = flip subtract -- inv x = -x This seems to work. What I like is that, like in EQ and Ord, functions are defined in several ways by default. So, for Int, you can choose to define either inv or minus, you don't have to do both. But subtract and - are defined over all types of Num, so it would be nice to have something like instance Group a => Num a where ..... I understand this cannot be done in Haskell98, but it can with the GHC extension? Does {-# OPTIONS_GHC -fallow-undecidable-instances #-} refer to possibly infinite definitions? Thanks again! Hans van Thiel