[Haskell] PROPOSAL: class aliases

David Menendez zednenem at psualum.com
Thu Oct 13 19:09:06 EDT 2005


Udo Stenzel writes:

> Simon Peyton-Jones wrote:
> > I've considered this before, but never done anything about it
> > because superclasses are so close.  Specifically, what is the
> > difference between
> > 
> > (i) class (C a, D a) => CD a
> > and
> > (ii)    class alias CD a = (C a, D a)
> > 
> > Note that (i) is Haskell 98.
> 
> I was about to suggest almost exactly the same.  In particular, John's
> proposal could be decomposed into three parts:
> 
> 1. Allow instance declarations to define methods of superclasses.
>    These are simply converted into the appropriate instance 
>    declarations for the superclasses.
> 
> 2. Allow class declarations to give defaults for methods in
>    superclasses.  Together with (1) they are used in the obvious way.
> 
> 3. Allow empty instance declarations to be implicitly generated.
> 
> 
> As a nice side effect, (1) and (2) together would allow us to cleanly
> get rid of the fmap/liftM annoyance:
> 
> *> class Functor f where { fmap :: ... }
> *> class Functor m => Monad m where { fmap = liftM }

This can also get us into trouble. Consider,

    class Functor f where fmap :: ...
    class Functor m => Monad m where { fmap = liftM; ... }
    class Functor d => Comonad d where { fmap = liftD; ... }
    
The Id functor is an instance of Monad and Comonad; what happens to the
fmap definition?

> If the instance for every type were allowed, Foo and Bar would be
> indistinguishable from true synonyms.  Further, if classes with no
> methods have no use currently, this "universal instance" could be
> compiler generated whenever a class without methods is declared.  Or 
> the empty class may be treated as a synonym, if that's simpler.  Does 
> this make any sense?

I don't know that method-less classes have *no* value. You could use
them to make additional claims about a type. For example,

    class Monoid m where { ... }
    
    class CommutativeMonoid m where {}

The idea being that instances of CommutativeMonoid satisfy additional
laws.
-- 
David Menendez <zednenem at psualum.com> | "In this house, we obey the laws
<http://www.eyrie.org/~zednenem>      |        of thermodynamics!"


More information about the Haskell mailing list