Polymorphism: Difference between revisions

From HaskellWiki
m (Make link pages)
(Improve wording, and add Wikipedia link.)
Line 1: Line 1:
[[Category:Glossary]]
[[Category:Glossary]]
A value is called polymorphic if, depending on the context where it's used, it can take on more than one type.
A value is polymorphic if, depending on the context where it's used, it can take on more than one type.


Various kinds of polymorphism are identified.
There are different kinds of polymorphism.


#[[Parametric polymorphism]]; mostly found in functional languages
#[[Parametric polymorphism]]; mostly found in functional languages
#[[Ad-hoc polymorphism]] or overloading
#[[Inclusion polymorphism]]; mostly found in object oriented languages
#[[Inclusion polymorphism]]; mostly found in object oriented languages
#[[Ad-hoc polymorphism]]; typically C++ overloading


== Haskell Examples ==
== Examples ==
<haskell>
<haskell>
foldr :: forall a b. (a -> b -> b) -> b -> [a] -> b
foldr :: forall a b. (a -> b -> b) -> b -> [a] -> b
</haskell>
</haskell>
<hask>foldr</hask> is a typical example of a polymorphic [[function]]. When actually used, it may take on any of a variety of types, for example:
<hask>foldr</hask> is a parametric polymorphic [[function]]. When actually used, it may take on any of a variety of types, for example:
<haskell>
<haskell>
::(Char ->Int->Int)->Int->String->Int
::(Char ->Int->Int)->Int->String->Int
::(String->String->String)->String->[String]->String
::(String->String->String)->String->[String]->String
</haskell>
</haskell>
An "integer literal" is polymorphic:
An "integer literal" is a parametric polymorphic data type:
<haskell>
<haskell>
1 :: forall t. (Num t) => t
1 :: forall t. (Num t) => t
Line 24: Line 24:
== References ==
== References ==
*[http://citeseer.nj.nec.com/cardelli85understanding.html On Understanding Types, Data Abstraction, and Polymorphism (1985)], by Luca Cardelli, Peter Wegner in ACM Computing Surveys.
*[http://citeseer.nj.nec.com/cardelli85understanding.html On Understanding Types, Data Abstraction, and Polymorphism (1985)], by Luca Cardelli, Peter Wegner in ACM Computing Surveys.
*[http://en.wikipedia.org/wiki/Type_polymorphism Type polymorphism] at Wikipedia

Revision as of 07:02, 6 October 2009

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.

  1. Parametric polymorphism; mostly found in functional languages
  2. Ad-hoc polymorphism or overloading
  3. Inclusion polymorphism; mostly found in object oriented languages

Examples

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

References