热门问题
时间线
聊天
视角
參數多態
编程概念 来自维基百科,自由的百科全书
Remove ads
參數多態在程序設計語言與類型論中是指聲明與定義函數、複合類型、變量時不指定其具體的類型,而把這部分類型作為參數使用,使得該定義對各種具體類型都適用。參數化多態使得語言更具表達力,同時保持了完全的靜態類型安全。[1] 這被稱為泛化函數、泛化數據類型、泛型變量,形成了泛型編程的基礎。
概述
參數多態允許函數或數據類型被一般性的書寫,從而它可以「統一」的處理值而不用依賴於它們的類型[2]。參數多態是使語言更加有表現力而仍維持完全的靜態類型安全的一種方式。
例如,可以構造連接兩個列表的一個函數append
,它不關心元素的類型:它可以附加整數的列表、實數的列表、字符串的列表等等。設定「類型變量a
」來指定這個列表中元素的類型。接着append
可以確定類型:
forall a. [a] × [a] -> [a]
這裡的[a]
指示具有類型a
的元素的列表類型。我們稱對於a
的所有的值,append
的類型「由a
參數化」。結果的列表必須由相同類型的元素組成。對於應用append
的每個位置,都要為a
確定一個值。
參數多態與特設多態相對。特設多態是指一個多態函數有多個不同的實現,依賴於其實參而調用相應版本的函數。因此,特設多態僅支持有限數量的不同類型。
歷史
克里斯托弗·斯特雷奇於1967年8月在哥本哈根的計算機程序設計暑期學校發表了著名論文《編程語言中的基礎概念》中首次提出了參數多態、特設多態、左值、右值等概念。[3]1975年ML語言首次實現了參數多態。[4]
現在,Standard ML, OCaml, F#, Ada, Haskell, Mercury, Visual Prolog, Scala, Julia等。Java, C#, Visual Basic .NET and Delphi引入了泛型作為參數多態。
直謂與非直謂
直謂參數多態(predicative parametric polymorphism)是指,類型包含類型變量不能用在被實例化為一個多態類形。直謂類型理論包括直覺類型論與NuPRL
非直謂多態(Impredicative polymorphism),也稱「頭等多態」(first-class polymorphism)是最強有力的參數多態形式。[5]非直謂是指自引用(self-referential),類型論中允許實例化類型的變量為任何類型,包括參數化類型,如自身。一個例子是系統F在類型變量X下,類型,其中X可以為T自身。
Remove ads
限定的參數多態
1985年盧克·卡德利與彼得·瓦格納提出類型參數允許限定(bounds)的益處。[6]限定量化(bounded quantification)也稱作「限定多態」(bounded polymorphism)或「約束泛型」(constrained genericity)。許多操作要求數據類型的某些知識,但仍可以把類型參數化。例如,判斷一項是否出現在列表中,需要比較項的相等。在Standard ML中,類型參數』』a被限定有相等判斷可用,因此具有如下類型的函數:』』a × 』』a list → bool且』』a可譯為任何定義了任何定義了相等判斷的類形。在Haskell中,限定是通過要求類型屬於某個類型類,因此同樣的函數在Haskell中可寫為:。大多數支持參數多態的面向對象語言可以把參數限定為給定類型的子類型。(見子類型多態)
下述Java例子中,類型參數T被限於I的子類:
class I {
}
class A <T extends I> {
public T id(T x) {
return x;
}
}
Remove ads
參見
- 多態遞歸
- 高種類多態
注釋
參考文獻
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads