Take the 2-minute tour ×  I'm reading the Wikipedia article on
Hindley–Milner Type Inference trying to make some sense out of
it. So far this is what I've understood:    1. Types are
classified as either monotypes or polytypes.   2. Monotypes are
further classified as either type constants (like int or string)
or type variables (like α and β).   3. Type constants can either
be concrete types (like int and string) or type constructors
(like Map and Set).   4. Type variables (like α and β) behave as
placeholders for concrete types (like int and string).  Now I'm
having a little difficulty understanding polytypes but after
learning a bit of Haskell this is what I make of it:    1. Types
themselves have types. Formally types of types are called kinds
(i.e. there are different kinds of types).   2. Concrete types
(like int and string) and type variables (like α and β) are of
kind *.   3. Type constructors (like Map and Set) are lambda
abstractions of types (e.g. Set is of kind * -> * and Map is of
kind * -> * -> *