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 } I'm not sure about (3). I think, to effectively make Foo a synonym for Bar, we'd need: *> class Foo a => Bar a *> instance Foo a => Bar a 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? Udo.
signature.asc
Description: Digital signature
_______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell