A value is polymorphic if, depending on the context where it's used, it can take on more than one type.
There are different kinds of polymorphism.
- Parametric polymorphism; mostly found in functional languages
- Ad-hoc polymorphism or overloading
- Inclusion polymorphism; mostly found in object oriented languages
foldr :: forall a b. (a -> b -> b) -> b -> [a] -> b
foldr is a parametric polymorphic function. When actually used, it may take on any of a variety of types, for example:
::(Char ->Int->Int)->Int->String->Int ::(String->String->String)->String->[String]->String
An "integer literal" is a parametric polymorphic data type:
1 :: forall t. (Num t) => t
- On Understanding Types, Data Abstraction, and Polymorphism (1985), by Luca Cardelli, Peter Wegner in ACM Computing Surveys.
- Type polymorphism at Wikipedia