Per completare la risposta di Gabriel, un modo di pensare a questo è che subtyping fornisce una forma debole di entrambi universale e esistenziali polimorfismo. Quando entrambe le direzioni del polimorfismo parametrico sono disponibili, allora l'espressività della sottotipizzazione è per lo più sussunta (specialmente quando non c'è sottotipizzazione di profondità). Ma non è il caso di Ocaml.
Ocaml sostituisce l'aspetto universale con il polimorfismo universale effettivo, ma mantiene la sottotipizzazione per fornire una forma di quantificazione esistenziale che altrimenti non avrebbe. Questo è necessario per formare ad es. raccolte eterogenee, come ad esempio <a: int> list
in cui si desidera poter archiviare oggetti arbitrari che abbiano almeno un metodo a
di tipo corretto.
vorrei andare anche oltre e dire che, mentre questo è di solito spiegata come subtyping nel mondo OCaml, si potrebbe in realtà interpretare le righe chiusi come esistenzialmente quantificata su una coda (sconosciuto). La coercizione tramite :>
sarebbe quindi un'introduzione esistenziale, rimanendo quindi più fedele al mondo del polimorfismo parametrico su cui sono costruite le righe. (Naturalmente, con questa interpretazione, lo #
farebbe un'eliminazione esistenziale implicita.) Se dovessi progettare un sistema simile a Ocaml da zero, probabilmente proverei a modellarlo in quel modo.
fonte
2013-05-27 15:33:29
Grazie! Mai pensato di sottotipizzare le coercizioni come quantificazione universale/esistenziale sulla variabile di riga ... –
In effetti, abbiamo dei mezzi per la quantificazione esistenziale in OCaml; attraverso la solita (ma pesante) codifica con un doppio strato di quantificatori universali di prima classe in campi di record polimorfici, o ora attraverso record di prima classe o GADT. È giusto che nel loro vecchio lavoro di Objective ML, Jérôme Vouillon e Didier Rëmy giustificassero i tipi chiusi in questo modo; ma notiamo che esiste un utilizzo diverso con le altre esistenziali che abbiamo: con i tipi chiusi, sia l'impacchettamento e il disimballaggio degli elementi esistenziali sono impliciti (l'impacchettamento avviene attraverso l'istanziazione (dedotta)), sia gli altri esistenziali sono più espliciti. – gasche