# Data declaration with constraint

### From HaskellWiki

(Difference between revisions)

(maybe multi-parameter type classes are a way out) |
Hairy Dude (Talk | contribs) m (→Solution: constraint -> context) |

(3 intermediate revisions by 2 users not shown) |

## Latest revision as of 03:12, 27 January 2016

## Contents |

## [edit] 1 Problem

### [edit] 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

### [edit] 1.2 Answer

In Haskell 98, 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. GHC as of version 7.2 disallows them by default (turn back on with `-XDatatypeContexts`

).

## [edit] 2 Solution

You could use ghc's Generalised Algebraic Data Structures (GADTs) to add an implicit context to the data constructors:

data T a where Cons :: C a => a -> T a

T

T a

Cons

C a

Cons x

There has been some discussion about whether it is sensible to want this.

A Haskell 98 workaround is to use multi-parameter type classes, whereT a

a

## [edit] 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....