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
[email protected]
http://www.haskell.org/mailman/listinfo/haskell