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
Am Donnerstag, 13. Oktober 2005 15:43 schrieb Simon Peyton-Jones:
John
Replying just to you to avoid spamming everyone.
Hmm, you did write to the list as well...
[...]
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
This is not okay. Hugs gives this error message (with ty = a): Cannot justify constraints in explicitly typed binding *** Expression : g *** Type : (C a, D a) => a *** Given context : (C a, D a) *** Constraints : CD a
[...]
Best wishes, Wolfgang
participants (2)
-
Simon Peyton-Jones -
Wolfgang Jeltsch