Kinds and type constructors
We have already studied and used types extensively. They allow us to distinguish between different forms of values in a way that can be used to document and automatically check our code. Kinds do the same thing one level up: they are a way of distinguishing different forms of types.
Proper types
The simplest and most ubiquitous group of types are so-called proper types. These are what we meant when we used the word type earlier in this book. Probably all the types that come to your mind are proper types: Int
, Bool
, [Char]
, Float -> String
, and so on.
The kind associated with proper types is written *
. This kind is often pronounced type, and in recent years, GHC has provided Type
as a synonym for *
in the Data.Kind
module.
We can check the kind of a type in GHCi with the :kind
command (or :k
for short):
*Main> :kind Int Int :: * *Main> :kind Bool -> (Char, Float) Bool -> (Char, Float) :: *
Another term for proper types is...