Le sous-typage indique que, étant donné l'expression d'un type, nous pouvons également lui donner un autre type. Nous disons que le premier est un sous-type du second et cette relation de sous-typage induit de nombreuses autres relations. En symboles,
Γ ⊢ E: SS< : TΓ ⊢ E: T
( ∀ α . Τ) < : τ[ 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
Habituellement, lorsque nous parlons d'un langage avec sous-typage, nous entendons un langage avec une relation de sous-typage non triviale sur les types sol , c'est-à-dire des types sans variables libres (qui, bien sûr, peuvent et vont générer des relations de sous-typage pour les types non sol). Donc, un système avec un polymorphisme de lignes comme celui de Roy n'est pas un langage avec sous-typage dans ce sens, bien qu'il ait la relation de sous-type non triviale qui vient de tout langage polymorphe paramétrique implicitement instancié. Le sous-typage structurel, d'autre part, énonce explicitement des relations de sous-typage non triviales pour les types de sol.
( ≅)ci-dessus, le sous-typage structurel implique des types de lignes mais pas l'inverse. Le polymorphisme paramétrique est orthogonal (dans le sens où vous pouvez l'avoir ou non, il y a certainement des interactions) avec les types de lignes ou le sous-typage structurel. Un système avec sous-typage structurel + polymorphisme paramétrique subsume le type de ligne + polymorphisme paramétrique (en supposant une sorte d '"union d'enregistrement") dans le sens où chaque terme dans ce dernier peut être tapé avec le même type dans le premier. Le premier est également capable de taper avec des types supplémentaires. En utilisant l'exemple de Brian, dans un système avec sous - typage structurel et du polymorphisme paramétrique answer
aurait le même type que celui de la ligne la version de frappe, mais il aurait aussi le type de la version sous - typage ainsi .
ρ{ c : Number }
information: passer d'un sous-type à un super-type perd (type) les informations. Cela peut souvent être ce que vous voulez: il y a un type commun qui vous intéresse et tout le reste n'est que des détails non pertinents. Mon parti pris est de conserver autant d'informations de type que possible et de les rejeter explicitement. Les inconvénients de l'approche du sous-typage sont souvent mis en évidence par des programmes dont le type est correct, mais uniquement parce que les types ont été poussés vers un type "top" (n sans information), par exemple l'enregistrement vide. Réitérant, le polymorphisme paramétrique (en général) préserve les informations de type, le sous-typage les perd intentionnellement.