Se ho un oggetto, come posso determinarne il tipo? (Esiste un OCaml equivalente all'operatore instanceof
di Java?)OCaml: tipo controllo degli oggetti
risposta
OCaml ha una tipizzazione strutturale per gli oggetti piuttosto che una digitazione nominativa come in Java. Quindi il tipo di oggetto è fondamentalmente determinato (e determinato solo) dai suoi metodi. Gli oggetti in OCaml possono essere creati direttamente, senza passare attraverso qualcosa come una classe.
È possibile scrivere funzioni che richiedono che gli oggetti argomento abbiano determinati metodi (e che tali metodi abbiano determinati tipi); per esempio, il seguente metodo prende un argomento che è un qualsiasi oggetto con un metodo di "bar":
let foo x = x#bar
C'è una discussione su "Matching Objects With Patterns" su Lambda the Ultimate (il documento usa Scala come lingua, quindi non risponderà alla tua domanda). Un più rilevante Ocaml mailing list thread indica che non esiste RTTI/safe-downcasting per gli oggetti.
Per algebrica (non oggetto) tipi che, ovviamente, hanno:
match expr with
Type1 x -> x
Type2 (x,y) -> y
chiamato (pattern) matching
Qualcuno ha scritto un extension che consente down/up-colata oggetti OCaml.
Ho difficoltà a farlo funzionare. Ho eseguito la corrispondenza dei modelli per valori all'interno di un tipo, ma non su diversi. –
C'è una differenza tra oggetti e tipi algebrici. La maggior parte delle persone sembra preferire evitare gli oggetti di Ocaml e usare i funtori + i tipi algebrici per la genericità. –
In breve, è necessario codificare il proprio meccanismo RTTI. OCaml non fornisce alcuna fusione RTTI o up/down (quest'ultima in parte perché l'ereditarietà e la sottotipizzazione sono ortogonali in OCaml piuttosto che unificate come in Java).
Si potrebbe fare qualcosa con stringhe o varianti polimorfiche per codificare le informazioni sul tipo nelle classi e negli oggetti. Credo che LablGTK faccia parte di questo e fornisca una libreria di utilità per supportare la codifica degli oggetti e il cast up/down.
Un po 'fuori tema, ma the OPA language (che attinge molto da alcuni aspetti di OCaml), consente l'equivalente della corrispondenza del modello sugli oggetti. Quindi è abbastanza fattibile.
- 1. Implementazione del controllo versione degli oggetti DB
- 2. Oggetti all'interno di oggetti in OCaml
- 3. Modelli di controllo delle versioni degli oggetti
- 4. Controllo della parità degli oggetti in Jasmine
- 5. Tipo OCaml dell'operatore più
- 6. Controllo della sottostringa in Ocaml
- 7. Serializzazione e controllo delle versioni degli oggetti in C#
- 8. tipo ocaml all'interno di un tipo
- 9. XUnit Asserzione per il controllo di uguaglianza degli oggetti
- 10. numeri interi di tipo in ocaml
- 11. Rendere gli oggetti di ridimensionamento degli oggetti di controllo con uno splitter
- 12. Serializzazione binaria degli oggetti C#
- 13. Controllo degli indirizzi IP
- 14. Estensione di un tipo esistente in OCaml
- 15. OCaml - Che cos'è un tipo non valido?
- 16. Rappresentazione del tipo di record AST OCaml
- 17. tipo polimorfico all'interno di un modulo (OCaml)
- 18. .net controllo oggetti explorer
- 19. toString() equivalente in OCaml
- 20. Inizializzazione proprietà degli oggetti nidificati
- 21. Serializzazione e deserializzazione degli oggetti?
- 22. Parse - salvataggio degli oggetti correlati
- 23. ElasticSearch MapperParsingException mapping degli oggetti
- 24. Oggetto selenio Riutilizzo degli oggetti
- 25. Prestazioni di typecasting degli oggetti
- 26. Javascript: delle proprietà degli oggetti
- 27. Controllo NSPredicate per tipo di classe oggetto
- 28. Controllo tipo Prolog
- 29. Controllo dell'ordine del costruttore di oggetti statici
- 30. Modulo e classe in OCaml
potresti pubblicare del codice, perché normalmente conosci il tipo di oggetto quando lo stai elaborando. – 0xFF