Data declaration with constraint
Contents |
1 Problem
1.1 Question
I have declared
data C a => T a = Cons a
and I hoped that now the type checker knows,
that every value of type T a satisfies the type constraint on a.
I like to declare an instance for an type constructor class for the type constructor T
but its methods require type constraints that depend on the particular type constructor T.
E.g.
instance Vector T where add (Cons x) (Cons y) = Cons (x+y) -- requires Num constraint on type a
1.2 Answer
Only functions can have type constraints.
The type constraint of a data only refers to the constructors.
The designers of Haskell 98 do now think, that it was a bad decision to allow constraints on constructors.
2 Solution
But how can one bake type constraints into a type? You cannot. One should insert a discussion here, whether it is sensible to want this.
For now you have to stick to multi-parameter type classes,
where T a and a are separate arguments.
3 See also
- Henning Thielemann in Haskell-Cafe: Context for type parameters of type constructors
- Mark Nicholls in Haskell-Cafe: nice simple problem for someone struggling....
