[Haskell] PROPOSAL: class aliases
John Meacham
john at repetae.net
Thu Oct 13 17:04:55 EDT 2005
On Thu, Oct 13, 2005 at 01:41:14PM -0400, Paul Govereau wrote:
> 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.
You would use the module system to hide these extra methods.. like your
prelude lookalike will have
module Prelude(Num(negate,(-),(+),(*),fromInteger), ...) where
and NewPrelude would export everything.
> 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).
no need, the module system lets us hide what we need to to keep
compatability and is not tied to the alias itself, which is good
because some people might want to use one and zero with Num and import
the appropriate module to let them do that.
John
--
John Meacham - ⑆repetae.net⑆john⑈
More information about the Haskell
mailing list