Difference between revisions of "Data declaration with constraint"
(constraint must be in front of the type) |
(maybe multi-parameter type classes are a way out) |
||
Line 7: | Line 7: | ||
data C a => T a = Cons a |
data C a => T a = Cons a |
||
</haskell> |
</haskell> |
||
− | and I hoped that now the type checker knows, |
+ | and I hoped that now the type checker knows, |
+ | that every value of type <hask>T a</hask> satisfies the type constraint on <hask>a</hask>. |
||
+ | I like to declare an instance for an type constructor class for the type constructor <hask>T</hask> |
||
+ | but its methods require type constraints that depend on the particular type constructor <hask>T</hask>. |
||
+ | |||
+ | E.g. |
||
+ | <haskell> |
||
+ | instance Vector T where |
||
+ | add (Cons x) (Cons y) = Cons (x+y) -- requires Num constraint on type a |
||
+ | </haskell> |
||
=== Answer === |
=== Answer === |
||
Line 17: | Line 26: | ||
== Solution == |
== Solution == |
||
− | But how can one bake type constraints into a type |
+ | 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 class]]es, |
||
+ | where <hask>T a</hask> and <hask>a</hask> are separate arguments. |
||
Revision as of 17:43, 21 December 2007
Problem
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
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.
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.
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....