# 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, 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. | ||

## Revision as of 17:43, 21 December 2007

## Contents

## 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....