2013-03-06 17 views
14

Leggendo "Tipi e linguaggi di programmazione", sono rimasto colpito dall'implementazione dell'oggetto utilizzando le chiusure e la sottotipizzazione dei record (capitolo 18). C'è qualche ragione particolare per cui OCaml non supporta la sottotipizzazione dei record (so che gli oggetti lo fanno, però)? In effetti, non riesco a trovare alcun linguaggio che supporti questo.Perché OCaml non supporta la registrazione di sottotitoli?

+1

SML # ha sottotipo di record. Gli oggetti di OCaml sono record con sottotipizzazione. La sottotipizzazione strutturale è potente, ma i suoi errori di tipo sono spesso criptici. Quindi gli utenti OCaml normalmente preferiscono i record più semplici senza sottotitoli. – camlspotter

+0

Grazie per aver segnalato SML #! C'è qualche differenza tra la sottotipizzazione dei record in SML # e la tipizzazione strutturale degli oggetti in OCaml? –

risposta

17

Tecnicamente, gli oggetti di OCaml in realtà non supportano la sottotipizzazione nel senso comune, ma il polimorfismo di riga . Ci sono molti vantaggi del polimorfismo di riga rispetto alla sottotipizzazione, in particolare entrambi sono più espressivi e funzionano molto meglio con l'inferenza di tipo (sottotipizzazione e tipo di inferenza non si combinano affatto bene).

Il problema principale con l'utilizzo del sottotipo di struttura o del polimorfismo di riga per tutti i record è che richiede un'implementazione di runtime significativamente più coinvolta e, di conseguenza, anche più costosa. Nei casi in cui i record semplici possono essere tradotti banalmente in tuple semplici, con l'accesso al campo solo indicizzazione, il sottotipo strutturale o il polimorfismo di riga richiedono la possibilità di "tagliare" un oggetto in modo trasparente, ovvero visualizzarlo sotto un supertipo con campi casuali rimossi. In generale, ciò richiede la ricerca del campo per hashing (come gli oggetti di Ocaml), o prova che passa le tecniche, in cui l'indice di ogni campo utilizzato da una funzione o da una delle sue calle deve essere passato come argomento nascosto oltre a il record attuale (questo è ciò che sta facendo SML, ad esempio).

In ogni caso, Ocaml ha record polimorfi, vengono chiamati solo oggetti. Ma puoi ignorare tutto il casino di classe che li circonda se non ne hai bisogno.

+1

Sì, il disordine di classe era quello che mi ha scoraggiato. Sono nuovo di OCaml, ma non vedo l'ora di saperne di più sul suo sistema di oggetti. Ad ogni modo, grazie per la tua risposta! –

8

La sottotipizzazione record è piuttosto pericolosa dal punto di vista della digitazione.

Supponiamo di avere un record con tre campi: a, be c. E vuoi creare un record con solo due campi: a e c. Il compilatore non sa che tipo stai usando fino a quando non ha finito di leggere l'intero disco e, alla fine, non può aiutarti se hai fatto un errore: hai dimenticato il campo b per esempio. Concordo pienamente sul fatto che questo punto di vista sia discutibile, ma penso che sia così che pensano le persone che scrivono ocaml.

+0

Grazie per aver segnalato questo. Avrei votato in su, ma la mia reputazione è troppo bassa;) –

+1

Hmm, non ho capito bene. Sottotipizzazione significa che è possibile utilizzare un record a 3 campi in luoghi che prevedono una registrazione a 2 campi. Ma nel tuo esempio, crei un record di 2 campi (possibilmente per errore). Anche con il sottotipo, il compilatore ti permetterebbe di usarlo solo in luoghi che in realtà si aspettano 2 campi (o meno). Ma va bene, dal momento che quei luoghi non guarderanno mai nemmeno il tuo terzo campo. – max

Problemi correlati