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?
risposta
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.
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! –
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.
Grazie per aver segnalato questo. Avrei votato in su, ma la mia reputazione è troppo bassa;) –
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
- 1. `stringa` in OCaml supporta UTF-8?
- 2. Perché Microsoft.NETCore.App non supporta netstandard1.6?
- 3. Toolbar sottotitoli non appaiono
- 4. Perché il threading di OCaml è considerato come `non sufficiente '?
- 5. perché SpEL non supporta la variabile unicode? Come lavorare?
- 6. Perché questo breve frammento di OCaml con Printf.printf non funziona?
- 7. Perché gcc non supporta le funzioni nude?
- 8. Perché i sottotitoli XS usano const char *?
- 9. Perché ObservableCollection non supporta le modifiche collettive?
- 10. Sottotitoli non visualizzati utilizzando WebVTT
- 11. perché Java non supporta l'ereditarietà multipla
- 12. Perché Kotlin non supporta "operatore ternario"
- 13. Perché XmlSerializer non supporta il dizionario?
- 14. Perché Carthage non supporta iOS 7?
- 15. Perché C11 non supporta le funzioni lambda
- 16. Perché GreenDAO non supporta completamente l'operatore LIKE?
- 17. Perché wsHttpBinding non supporta lo streaming?
- 18. L'email di tipo non supporta la selezione
- 19. perché usare Akka eventhandler per la registrazione
- 20. Perché preferire la conversione in tuple in OCaml?
- 21. Perché il motore MyISAM di MySQL non supporta chiavi esterne?
- 22. Perché Scheme non supporta gli ambienti di prima classe?
- 23. perché OCaml usa la sottotipizzazione per le varianti polimorfiche?
- 24. Python: importazione sottotitoli jolly
- 25. Perché Java non supporta l'inferenza di tipo per i costruttori?
- 26. Perché mxml non supporta i costruttori di componenti?
- 27. UITableViewAutomaticDimension non funziona correttamente con Sottotitoli UITableViewCells
- 28. perché logg_out.html non si sovrappone alla registrazione di django?
- 29. OCaml valori di ritorno
- 30. Perché "1.0 == 1.0" è falso in Ocaml?
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
Grazie per aver segnalato SML #! C'è qualche differenza tra la sottotipizzazione dei record in SML # e la tipizzazione strutturale degli oggetti in OCaml? –