[Haskell] PROPOSAL: class aliases

Simon Peyton-Jones simonpj at microsoft.com
Thu Oct 13 09:43:18 EDT 2005


Replying just to you to avoid spamming everyone.

| in particular,
| (CD a) => a and (C a,D a) => a are distinct types. this means that
| you cannot use the aliases as abreviations or alternate names, which
| a very nice side effect. with fine grained class hierarchies, type
| signatures get big fast. having a shorthand is very nice.

I don't agree.  What do you mean by "distinct types"?  In H98 both of
these are ok:

	f :: CD a => ty
	f = ...code...

	g :: (C a, D a) => ty
	g = f
	f :: (C a, D a) => ty
	f = ...code...

	g :: (CD a) => ty
	g = f

That is, the two types are interchangeable.

| Another illustrative example is one that combines aliases with
| superclasses.
| class alias Num a = Show a => (Additive a, Multiplicative a)
| now, Show is a superclass, but Num is an alias for Additive and
| Multiplicative.

Yes, this part really confused me.  I didn't understand what it meant.
Here's my attempt to summarise what I think you are proposing.  (This
summary might be useful to add to your note.)

(1a) If I have 
	f :: Num a => ...
then I can use any of the class ops of Show, Additive, Multiplicative in
the body of f.

(1b) Dually, a call of f can be satisfied if (Show, Additive,
Multiplicative) are all available (or Num of course).

(2a) I can declare an instance of Num 
* either by giving separate instances for Show, Additive,
* or by giving a separate instance for Show, and an instance for Num

(2b) If a type T is an instance of Additive, then it's an error to also
give a Num instance, even if the instance only gives the methods for

(3) In the class decl for Num I can override the default methods for
Additive, Multiplicative.  These new default methods will be used (only)
if I give an instance decl for Num.

Here, (1a,b) are satisfied by H98 superclasses, whereas (2a) and (3) are
not.  Are there any points I've missed in this list?


More information about the Haskell mailing list