In programming languages and type theory, parametric polymorphism allows a single piece of code to be given a "generic" type, using variables in place of actual types, and then instantiated with particular types as needed. Parametrically polymorphic functions and data types are sometimes called generic functions and generic datatypes, respectively, and they form the basis of generic programming.
Parametric polymorphism may be contrasted with ad hoc polymorphism. Parametrically polymorphic definitions are uniform: they behave identically regardless of the type they are instantiated at. In contrast, ad hoc polymorphic definitions are given a distinct definition for each type. Thus, ad hoc polymorphism can generally only support a limited number of such distinct types, since a separate implementation has to be provided for each type.
It is possible to write functions that do not depend on the types of their arguments. For example, the identity function simply returns its argument unmodified. This naturally gives rise to a family of potential types, such as , , , and so on. Parametric polymorphism allows to be given a single, most general type by introducing a universally quantified type variable:
The polymorphic definition can then be instantiated by substituting any concrete type for , yielding the full family of potential types.
The identity function is a particularly extreme example, but many other functions also benefit from parametric polymorphism. For example, an function that appends two lists does not inspect the elements of the list, only the list structure itself. Therefore, can be given a similar family of types, such as , , and so on, where denotes a list of elements of type . The most general type is therefore
which can be instantiated to any type in the family.
Parametrically polymorphic functions like and are said to be parameterized over an arbitrary type . Both and are parameterized over a single type, but functions may be parameterized over arbitrarily many types.