The ML system associates a type with every value, including
functions, using Milner's
type--checking algorithm; thus the programmer is usually not required
to declare types explicitly. Furthermore, the type assignment is
polymorphic
; a given value may have a number of
different types associated
with it.
Essentially, the ``degree of freedom''
of type
assignments corresponds to the presence of type variables
in the
type expressions. For example, the identity function can be
used on any type; we do not need to define different identity functions for
each type. Thus, the type associated with the identity function is
, where the
is a type variable.
A more interesting example
is the list constructor ``.''. This has type
. The user may also define an append function that
``glues'' two lists together;
the system would
assign to it the type
.
Note that if
an attempt is made to use the append function to concatenate a list of
integers with a list of tokens, a type error will result.