Data declaration with constraint
From HaskellWiki
(Difference between revisions)
(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, that every value of type <hask>T a</hask> satisfies the type constraint on <hask>a</hask>. | + | 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. | ||
Current revision
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 typeT a
a
T
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 adata
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,
whereT a
a
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....
