サブタイピングでは、あるタイプの式が与えられた場合、別のタイプも与えることができます。前者は後者のサブタイプであり、このサブタイプ関係は他の多くの関係を誘発すると言います。記号で、
Γ ⊢ E:SS< : TΓ ⊢ E:T
ここで重要なこと(および私がレビューした理由)は、同じ式に2つの異なるタイプが与えられていることです。パラメトリック多型言語で暗黙タイプのインスタンス我々は、次のサブタイプの関係を有する:
すべてのタイプのT。タイプFがSystem Fのように明示的にインスタンス化されている場合、このサブタイプ関係は保持されません。(∀ α 。τ)< : τ[ T/ α]T
{ ℓ1:A 、ℓ2:B } < : { ℓ2:B 、ℓ1:A }{ ℓ1:A 、ℓ2:B } ≅{ ℓ2:B 、ℓ1:A }S≅T⟺S< : T∧ T< : S{ ℓ1:A 、ℓ2:B } = { ℓ2:B 、ℓ1:A }T< : T
通常、サブタイピングのある言語について話すときは、グラウンドタイプ、つまり自由変数のないタイプ(もちろん、非グラウンドタイプのサブタイピングリレーションシップを生成できる)で非自明なサブタイピング関係を持つものを意味します。したがって、Roy'sのような行ポリモーフィズムを持つシステムは、この意味でサブタイピングを持つ言語ではありませんが、暗黙的にインスタンス化されたパラメトリックポリモーフィック言語に由来する重要なサブタイプの関係はあります。一方、構造的サブタイピングでは、地盤タイプの重要なサブタイピング関係を明示的に示します。
行タイプ、Iは同等以上説明したように非自明な統一を有することを意味します。これがないと、行タイプはネストされたタプルにすぎません。行タイプはパラメトリック多相性に依存しないことに注意してください。行変数を意味するわけではありません。(≅ )についての議論から( ≅)上記では、構造的サブタイピングは行タイプを意味しますが、その逆は意味しません。パラメトリック多相性は、行タイプまたは構造的サブタイピングと直交しています(持つことができるかどうかという意味で、間違いなく相互作用があります)。構造的サブタイピング+パラメトリックポリモーフィズムを備えたシステムは、行タイプ+パラメトリックポリモーフィズム(ある種の「レコード結合」を想定)を包含し、後者のすべての用語は前者の同じタイプで入力できるという意味です。前者は、追加のタイプを入力することもできます。ブライアンの例を使用すると、構造サブタイプとパラメトリック多型answer
を持つシステムでは、行タイプバージョンと同じタイプになりますが、サブタイプバージョンのタイプもあります。
ρ{ c : Number }
情報:サブタイプからスーパータイプに移行すると、情報が失われます(タイプ)。多くの場合、これはあなたが望むものです。あなたが気にする共通のタイプがあり、他のすべては無関係な詳細です。私のバイアスは、可能な限り多くの型情報を維持し、明示的にのみ破棄することです。サブタイプのアプローチの欠点は、タイプが正しいが、タイプが(情報のない)「トップ」タイプ(空のレコードなど)にプッシュされたためだけのプログラムによってしばしば証明されます。繰り返しますが、パラメトリック多相性(一般的に)は型情報を保持し、サブタイプは意図的にそれを失います。