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

Reply via email to