This morning, I decided to try discussing different aspects of Haskell, in part as a way to get some ideas clear in my head. As such, this is the first instalment of what may be a much larger series of articles.
So to start with, we could start talking about values, types and kinds; these are the building blocks of data.
We first have values, which are invisible to your type system (and therefore have no guarantees at compilation time). Types are a way of categorising values (values are members of types).
Kinds are ways of categorising type constructors. Type constructors can be considered to be type-level functions, which can take types as parameters, and can then create other types. Kinds represent the “shape” of such type constructors.
a :: Int a = 3