Polymorphism

Yingxin Wu · 2012-06-09

一个值如果根据上下文可以表现为多种类型,就可以称其之为多态的。多态可以分为很多不同的种类:

  1. 参数型多态(Parametric polymorphism),通常可以在函数式语言中找到
  2. 特殊的多态(Ad-hoc polymorphism)或重载(Overloading)
  3. 包含型多态(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

不同之处在于,此处的类型变量是受约束的 - 它必须是一个数字。

参考资料

Twitter, Facebook