Il sottotipo dice che data un'espressione di un tipo possiamo dargli anche un altro tipo. Diciamo che il primo è un sottotipo del secondo e questa relazione di sottotipo induce molte altre relazioni. Nei simboli,
Γ ⊢ 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
Di solito quando parliamo di una lingua con sottotipo intendiamo una con una sottotipazione non banale su tipi di terreno , cioè tipi senza variabili libere (che, ovviamente, possono e genereranno relazioni di sottotipo per tipi non di terra). Quindi un sistema con polimorfismo di riga come quello di Roy non è un linguaggio con sottotipizzazione in questo senso, sebbene abbia una relazione di sottotipo non banale che proviene da qualsiasi linguaggio polimorfico parametrico implicitamente istanziato. Il sottotipo strutturale, d'altra parte, afferma esplicitamente relazioni di sottotipizzazione non banali per i tipi di terreno.
( ≅)sopra, il sottotipo strutturale implica tipi di riga ma non viceversa. Il polimorfismo parametrico è ortogonale (nel senso che puoi averlo o meno, ci sono sicuramente interazioni) per tipi di file o sottotipi strutturali. Un sistema con sottotipizzazione strutturale + polimorfismo parametrico sottrae il tipo di riga + polimorfismo parametrico (assumendo una sorta di "unione record"), nel senso che ogni termine in quest'ultimo può essere digitato con lo stesso tipo nel primo. Il primo è in grado di digitare anche con tipi aggiuntivi. Usando l'esempio di Brian, in un sistema con sottotipo strutturale e polimorfismo parametrico answer
avrebbe lo stesso tipo come nella versione di riga di battitura, ma avrebbe anche il tipo di versione subtyping pure .
ρ{ c : Number }
informazioni: passare da un sottotipo a un supertipo perde (tipo) informazioni. Questo può spesso essere quello che vuoi: c'è un tipo comune a cui tieni e tutto il resto sono dettagli irrilevanti. La mia propensione è quella di mantenere quante più informazioni possibili sul tipo e scartarle esplicitamente. Gli svantaggi dell'approccio del sottotipo sono spesso evidenziati da programmi che sono corretti, ma solo perché i tipi sono stati inseriti in un tipo "top" (n privo di informazioni), ad esempio il record vuoto. Ribadendo, il polimorfismo parametrico (in generale) conserva le informazioni sul tipo, il sottotipo le perde intenzionalmente.