On Oct 12, John Meacham wrote: > > [...] > > > class Num a where > > (+), (*) :: a -> a -> a > > (-) :: a -> a -> a > > negate :: a -> a > > fromInteger :: Integer -> a > > ideally we would want to split it up like so (but with more mathematically > precise names): > > > class Additive a where > > (+) :: a -> a -> a > > zero :: a > > > > class Additive a => AdditiveNegation where > > (-) :: a -> a -> a > > negate :: a -> a > > x - y = x + negate y > > > > class Multiplicative a where > > (*) :: a -> a -> a > > one :: a > > > > class FromInteger a where > > fromInteger :: Integer -> a > > [...] > > > class alias (Addititive a, AdditiveNegation a, > > Multiplicative a, FromInteger a) => Num a where > > one = fromInteger 1 > > zero = fromInteger 0 > > negate x = zero - x
This class alias isn't 100% backwards compatible, because the original Num class doesn't have a zero method. For instance, if I had written this function in my program: zero :: Num a => a zero = fromInteger 0 Then, after swapping in the new alias, Num, the compiler would probably complain that I have multiple definitions for zero. Perhaps there could be a mechanism for hiding class methods as well? e.g. class alias (Addititive a without zero, -- remove zero AdditiveNegation a, Multiplicative a, FromInteger a) => Num a where ... I am not sure this could still be done with a source-to-source translation, but perhaps it is worth considering. Of course, if we allow union and subtraction, then why not addition, intersection, complement (ok, maybe not complement). Paul _______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell