複製鏈接
請複製以下鏈接發送給好友

參數多態

鎖定
參數多態(parametric),採用參數化模板,通過給出不同的類型參數,使得一個結構有多種類型。
中文名
參數多態
外文名
Parametric polymorphism
應用內涵
提供的都是堆棧抽象操作
實現結構
採用同類數據結構
元素的類型
一些用常量表示的細節不同
領    域
計算機科學

參數多態簡介

參數多態程序設計語言類型論中是指聲明與定義函數、複合類型、變量時不指定其具體的類型,而把這部分類型作為參數使用,使得該定義對各種具體類型都適用。參數化多態使得語言更具表達力,同時保持了完全的靜態類型安全。這被稱為泛型函數、泛型數據類型、泛型變量,形成了泛型編程的基礎。
參數多態名字來源於其發明人克里斯托弗·斯特雷奇,與特設多態(ad hoc polymorphism)相對。特設多態是指一個多態函數有多個不同的實現,依賴於其實參而調用相應版本的函數。因此,特設多態僅支持有限數量的不同類型。 [1] 

參數多態歷史

克里斯托弗·斯特雷奇於1967年8月在哥本哈根的計算機程序設計暑期學校發表了著名論文Fundamental Concepts in Programming Languages中首次提出了參數多態特設多態左值右值等概念。1975年ML語言首次實現了參數多態。
現在,Standard ML,OCamlF#AdaHaskellMercuryVisual PrologScalaJulia等。JavaC#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] 
參考資料
  • 1.    Hindley, J. Roger, The principal type scheme of an object in combinatory logic, Transactions of the American Mathematical Society (American Mathematical Society), 1969, 146: 29–60
  • 2.    Hindley, J. Roger, The principal type scheme of an object in combinatory logic, Transactions of the American Mathematical Society (American Mathematical Society), 1969, 146: 29–60