John
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
is
| 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
and
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,
Multiplicative;
* or by giving a separate instance for Show, and an instance for Num
itself
(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
Multiplicative.
(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?
Simon
_______________________________________________
Haskell mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell