サブタイピング (計算機科学)
サブタイピング(subtyping)は、Simula67で登場した継承と仮想手続き(仮想関数)を分析した計算機科学者ジョン・レイナルド(英語版)によって1980年に考案された言葉である。それを更に研究したルカ・カルデリ(英語版)らが、1985年にインクルージョン多相という概念にまとめた。
サブタイピングは、型理論ではなく、オブジェクト指向言語の継承とメソッドオーバーライドによる動的ディスパッチ(英語版)のポリモーフィズムを由来にしている。1994年にバーバラ・リスコフが、オブジェクト指向の継承のサブタイピング用法を重視したリスコフの置換原則を提唱している。サブタイピングは上位概念と下位概念(hypernymy・hyponymy)に言及されることがあり、また全体概念と部分概念(holonymy・meronymy)にも言及されることがある。
サブタイピングに関連付けられているその他の概念としては、モジュラープログラミング(英語版)発のインターフェース、ジェネリックプログラミングの総称型、部分構造論理由来の部分構造型システム(英語版)などがある。サブタイピングを型理論視点で解釈拡張したものにSystem F-サブ(英語版)がある。
関数型言語の型構築子には深さサブタイピング(depth subtyping)という別解釈が加えられている。関数型言語はレコード型の深さサブタイピングと幅サブタイピング(width subtyping)や、関数の型(英語版)の共変反変サブタイピングも取り入れている。
最初の例は、UMLクラス図のスーパークラスとサブクラスのサブタイピングである(右図参照)。ここでのsupertypeは基底型、subtypeは派生型と呼ばれやすい。
トリは基底型であり、アヒル/カッコウ/ダチョウは派生型である。トリ型の変数xには、トリ型のインスタンスだけでなく、アヒル/カッコウ/ダチョウ型のインスタンスをも代入できて、その際の変数xは、トリ型の派生(sub)で型付け(typing)されることになる。
二番目の例は、型の上位概念と下位概念に基づいた変数である。ここではsupertypeは上位型、subtypeは下位型と呼ばれやすい。
それぞれ数値型のNumber(総称的な数値)Float(浮動小数点)Integer(整数)があるとして、これらはサブタイプ記号<:でこのように表現できる。
Integer <: Float <: Number
Integer <: Number と Float <: Number
上の規則によって、Number型の変数xに、Float型とInteger型の値を代入できることになる。従って変数xは多相になる。
そのコード例はこのようになる。
関数maxは、Number型の引数x,yを通して、Float値とInteger値を計算できる。その際の引数x,yは、Number型の下位(sub)で型付け(typing)されることになる。