>My intention was that the context before a data constructor shall mean that
>the variable (a) shall be constrained only in the type of the constructor
>function, not in the type definition.

Okay, functional laguages have the notion that binding a variable is true
for all time (like in mathematics)... Therefore if "a" is "1" then it has
type Integer - forever. In this case the type of a in the first definition
is "forall a . Num a". This is true for all references to a where we mean the 
same a. Because a is on the left-hand-side of the equals we assume all a's on
the right are the same (it is the only rational choise) and hence we
end up with two different types for a single variable. you could say something
like (this doesn't work by the way)

        data Either a =
                (forall a . Num a => Left a)
                (forall a . Ord a => Right a) 

But here the a in each set of brackets has nothing to do with the a on the 
left hand side. This is different from:

        (data Either a = Num a => Left a | Ord a => Right a) 

where it is clear a == a but Ord a /= Num a

Doing anything different would break the scoping rules for variables, and
it is much more important IMHO to keep these consistant. Good languages
are: Consistant, Symmetric, and Complete.

        Regards,
        Keean.
_______________________________________________
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to