参数多态在
程序设计语言与
类型论中是指声明与定义函数、复合类型、变量时不指定其具体的类型,而把这部分类型作为参数使用,使得该定义对各种具体类型都适用。参数化多态使得语言更具表达力,同时保持了完全的静态
类型安全。这被称为泛型函数、泛型数据类型、泛型变量,形成了泛型编程的基础。
参数多态名字来源于其发明人
克里斯托弗·斯特雷奇,与
特设多态(ad hoc polymorphism)相对。特设多态是指一个多态函数有多个不同的实现,依赖于其实参而调用相应版本的函数。因此,特设多态仅支持有限数量的不同类型。
克里斯托弗·斯特雷奇于1967年8月在
哥本哈根的计算机程序设计暑期学校发表了著名论文Fundamental Concepts in Programming Languages中首次提出了参数多态、
特设多态、
左值、
右值等概念。1975年
ML语言首次实现了参数多态。
C++的
模板特化这样的类型多态(type polymorphism)表面上类似于参数多态并同时引入了特设多态。
直谓参数多态(predicative parametric polymorphism)是指,类型包含类型变量不能用在被实例化为一个多态类形。直谓类型理论包括
直觉类型论与NuPRL。
非直谓多态(Impredicative polymorphism),也称“头等多态”(first-class polymorphism)是最强有力的参数多态形式。非直谓是指自引用(self-referential),
类型论中允许实例化类型的变量为任何类型,包括参数化类型,如自身。一个例子是
系统F在类型变量X下,类型,其中X可以为T自身。
1985年卢克·卡德利与
彼得·瓦格纳提出类型参数允许限定(bounds)的益处。限定量化(bounded quantification)也称作“限定多态”(bounded polymorphism)或“约束泛型”(constrained genericity)。许多操作要求数据类型的某些知识,但仍可以把类型参数化。例如,判断一项是否出现在列表中,需要比较项的相等。在Standard ML中,类型参数’’a被限定有相等判断可用,因此具有如下类型的函数:’’a×’’alist → bool且’’a可译为任何定义了任何定义了相等判断的类形。在
Haskell中,限定是通过要求类型属于某个type class,因此同样的函数在Haskell中可写为: 。大多数支持参数多态的面向对象语言可以把参数限定为给定类型的
子类型。
特定多态(
ad hocpolymorphism)是
程序设计语言的一种
多态,多态函数有多个不同的实现,依赖于其实参而调用相应版本的函数。因此,特设多态仅支持有限数量的不同类型。
函数重载乃至
运算符重载也是特设多态的一种。
特定多态的名字来源于其发明人
克里斯托弗·斯特雷奇于1967年8月在
哥本哈根的计算机程序设计暑期学校发表了著名论文Fundamental Concepts in Programming Languages中首次提出了
参数多态、特设多态、
左值、
右值等概念。。特设多态与
参数多态相对。ad hoc在这里并不是贬义,而是指这类多态并不是
类型系统的基本特性,不是像参数多态那样适用于无穷多的类型,而是针对特定问题的解决方案。
换言之,参数多态对各模板参数的实现,是根据模板的通用(generically)的行为的抽象,即泛型的语义;而特设多态可以针对不同的版本实现完全不同的行为,或曰对于每个不同的模版参数都有单独的版本来应对。打个比方:假如我们要把原材料切成两半——