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.