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 Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell