
On Thursday 02 September 2010 22:06:45, Alec Benzer wrote:
Because the language specification imposed that instance declarations must have the form
I guess I meant why does the language specification impose this?
Historical accident, probably. Perhaps it's easier to implement.
instance Class (T a1 a2 ... an) where ...
where T is a type constructor, 0 <= n and a1, a2, ..., an are *distinct* type variables.
I don't understand, what you you mean by distinct? Like how is String not a distinct type variable by itself?
distinct = different, however, String is not a type variable, it's a type (more specifically, a type synonym). Type variables start with a lowercase letter, things starting with an uppercase letter are type constructors (in this context), same as for values f True = whatever -- True is a data constructor f true = whatever -- true is a variable, matches anything So in Haskell98 (and Haskell2010), instance Class (Either a b) where ... is a legal instance declaration, the instance head is a type constructor (Either) applied to two distinct type variables. Not legal are instance Class (Either a a) where ... (type variables not distinct), instance Class (Either Char a) where ... (Char is not a type variable). It's an inconvenient restriction, so you can turn on FlexibleInstances to allow the latter two instances (not both in the same programme, though, that would need the dreaded OverlappingInstances).