参数多态

科技工作者之家 2020-11-17

参数多态(parametric),采用参数化模板,通过给出不同的类型参数,使得一个结构有多种类型。

简介参数多态在程序设计语言与类型论中是指声明与定义函数、复合类型、变量时不指定其具体的类型,而把这部分类型作为参数使用,使得该定义对各种具体类型都适用。参数化多态使得语言更具表达力,同时保持了完全的静态类型安全。这被称为泛型函数、泛型数据类型、泛型变量,形成了泛型编程的基础。

参数多态名字来源于其发明人克里斯托弗·斯特雷奇,与特设多态(ad hoc polymorphism)相对。特设多态是指一个多态函数有多个不同的实现,依赖于其实参而调用相应版本的函数。因此,特设多态仅支持有限数量的不同类型。1

历史克里斯托弗·斯特雷奇于1967年8月在哥本哈根的计算机程序设计暑期学校发表了著名论文Fundamental Concepts in Programming Languages中首次提出了参数多态、特设多态、左值、右值等概念。1975年ML语言首次实现了参数多态。

现在,Standard ML,OCaml,F#,Ada,Haskell,Mercury,Visual Prolog,Scala,Julia等。Java,C#,Visual Basic .NETandDelphi引入了泛型作为参数多态。

C++的模板特化这样的类型多态(type polymorphism)表面上类似于参数多态并同时引入了特设多态。1

直谓与非直谓直谓多态直谓参数多态(predicative parametric polymorphism)是指,类型包含类型变量不能用在被实例化为一个多态类形。直谓类型理论包括直觉类型论与NuPRL。2

非直谓多态非直谓多态(Impredicative polymorphism),也称“头等多态”(first-class polymorphism)是最强有力的参数多态形式。非直谓是指自引用(self-referential),类型论中允许实例化类型的变量为任何类型,包括参数化类型,如自身。一个例子是系统F在类型变量X下,类型,其中X可以为T自身。

类型论中,最常被研究的非直谓有类型λ演算是基于λ立方体,特别是系统F。2

限定的参数多态1985年卢克·卡德利与彼得·瓦格纳提出类型参数允许限定(bounds)的益处。限定量化(bounded quantification)也称作“限定多态”(bounded polymorphism)或“约束泛型”(constrained genericity)。许多操作要求数据类型的某些知识,但仍可以把类型参数化。例如,判断一项是否出现在列表中,需要比较项的相等。在Standard ML中,类型参数’’a被限定有相等判断可用,因此具有如下类型的函数:’’a×’’alist → bool且’’a可译为任何定义了任何定义了相等判断的类形。在Haskell中,限定是通过要求类型属于某个type class,因此同样的函数在Haskell中可写为: 。大多数支持参数多态的面向对象语言可以把参数限定为给定类型的子类型。2

特设多态特定多态(ad hocpolymorphism)是程序设计语言的一种多态,多态函数有多个不同的实现,依赖于其实参而调用相应版本的函数。因此,特设多态仅支持有限数量的不同类型。函数重载乃至运算符重载也是特设多态的一种。

特定多态的名字来源于其发明人克里斯托弗·斯特雷奇于1967年8月在哥本哈根的计算机程序设计暑期学校发表了著名论文Fundamental Concepts in Programming Languages中首次提出了参数多态、特设多态、左值、右值等概念。。特设多态与参数多态相对。ad hoc在这里并不是贬义,而是指这类多态并不是类型系统的基本特性,不是像参数多态那样适用于无穷多的类型,而是针对特定问题的解决方案。

换言之,参数多态对各模板参数的实现,是根据模板的通用(generically)的行为的抽象,即泛型的语义;而特设多态可以针对不同的版本实现完全不同的行为,或曰对于每个不同的模版参数都有单独的版本来应对。打个比方:假如我们要把原材料切成两半——

参数多态:只要能“切”,就用工具来切割它;

特设多态:根据原材料是铁还是木头还是什么来选择不同的工具来切。2

本词条内容贡献者为:

王慧维 - 副研究员 - 西南大学

科技工作者之家

科技工作者之家APP是专注科技人才,知识分享与人才交流的服务平台。