Quali sono le principali differenze tra polimorfismo di riga e sottotipizzazione


20

Sento spesso che il polimorfismo delle file è un approccio migliore del sottotipo, ma ho difficoltà a trovare qualcosa che li paragona in dettaglio. Sono particolarmente interessato alla prospettiva di un utente del sistema.

Mi sono imbattuto in questo post del blog, ma mi lascia più domande di prima. Ad esempio, afferma che un sistema con sottotipizzazione assegnerà un tipo, mentre un sistema con tipizzazione di riga ne assegnerà un altro; ciò significa che se un sistema che presumibilmente ha un sottotipo assegna il tipo di "tipizzazione di riga", che pretende in modo errato?

L'unica grande differenza che vedo è che la digitazione delle righe consente di allineare i tipi di argomenti (ovvero scrivere una funzione a due argomenti che si occupa solo del acampo dei suoi argomenti, ma richiede che i suoi argomenti abbiano gli stessi campi) .

Risposte:


10

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}STS<:TT<: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 answeravrebbe 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.


Grazie per la risposta dettagliata! Un'altra domanda: se il sottotipo strutturale + il polimorfismo parametrico sussiste la digitazione delle righe + il polimorfismo parametrico, perché mai dovresti usare quest'ultimo?
Alex R

@AlexR Come accennato da Brian nel suo post sul blog, il sottotitolo interagisce in modo estremamente scadente con l'inferenza di tipo e molti altri aspetti, come il problema ergonomico che ho citato. Ci sono anche problemi di implementazione e complessità del linguaggio. Ad essere onesti, esiste un ampio spazio di progettazione sia per i "tipi di riga" che per i sottotipi, quindi i "subsume" sono un'affermazione approssimativa.
Derek Elkins,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.