.. _kinding:
Explicitly-kinded quantification
--------------------------------
.. extension:: KindSignatures
:shortdesc: Enable kind signatures.
Implied by :extension:`TypeFamilies` and :extension:`PolyKinds`.
:since: 6.8.1
Allow explicit kind signatures on type variables.
Haskell infers the kind of each type variable. Sometimes it is nice to
be able to give the kind explicitly as (machine-checked) documentation,
just as it is nice to give a type signature for a function. On some
occasions, it is essential to do so. For example, in his paper
"Restricted Data Types in Haskell" (Haskell Workshop 1999) John Hughes
had to define the data type: ::
data Set cxt a = Set [a]
| Unused (cxt a -> ())
The only use for the ``Unused`` constructor was to force the correct
kind for the type variable ``cxt``.
GHC now instead allows you to specify the kind of a type variable
directly, wherever a type variable is explicitly bound, with the extension
:extension:`KindSignatures`.
This extension enables kind signatures in the following places:
- ``data`` declarations: ::
data Set (cxt :: Type -> Type) a = Set [a]
- ``type`` declarations: ::
type T (f :: Type -> Type) = f Int
- ``class`` declarations: ::
class (Eq a) => C (f :: Type -> Type) a where ...
- ``forall``\'s in type signatures: ::
f :: forall (cxt :: Type -> Type). Set cxt Int
The parentheses are required.
As part of the same extension, you can put kind annotations in types as
well. Thus: ::
f :: (Int :: Type) -> Int
g :: forall a. a -> (a :: Type)
The syntax is
.. code-block:: none
atype ::= '(' ctype '::' kind ')
The parentheses are required.