Data declaration with constraint

From HaskellWiki
Jump to: navigation, search



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.

For example:

instance Vector T where


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



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

This way, functions using T no longer need a constraint. Instead, constructing a T a using Cons needs a C a context, and when something pattern matches a Cons x, the context comes with it.


A Haskell 98 workaround is to use multi-parameter type classes, where T a and a are separate arguments.

See also