一个值如果根据上下文可以表现为多种类型,就可以称其之为多态的。多态可以分为很多不同的种类:
- 参数型多态(Parametric polymorphism),通常可以在函数式语言中找到
- 特殊的多态(Ad-hoc polymorphism)或重载(Overloading)
- 包含型多态(Inclusion polymorphism),多见于面向对象语言
- 此处Ad-hoc指这种多态不属于类型系统的基本特性,因此取特例的含义
例子
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr函数的类型包含了类型变量,因此它是一个参数型多态的函数。实际使用时,它可以用于任意类型的参数,比如:
:: (Char -> Int -> Int) -> Int -> String -> Int -- a = Char, b = Int (note String = [Char])
:: (String -> String -> String) -> String -> [String] -> String -- a = b = String
数字文法是重载的(即为特殊的多态):
1 :: (Num t) => t
不同之处在于,此处的类型变量是受约束的 - 它必须是一个数字。
参考资料
- haskellwiki上的原文
- On Understanding Types, Data Abstraction, and Polymorphism (1985), by Luca Cardelli, Peter Wegner in ACM Computing Surveys.
- Type polymorphism at Wikipedia