OCaml: Type Checking Objects
-
07-07-2019 - |
Domanda
Se ho un oggetto, come posso determinarne il tipo? (Esiste un OCaml equivalente all'operatore instanceof
di Java?)
Soluzione
OCaml ha una tipizzazione strutturale per oggetti piuttosto che una tipizzazione nominativa come in Java. Quindi il tipo di un oggetto è sostanzialmente determinato (e determinato solo) dai suoi metodi. Gli oggetti in OCaml possono essere creati direttamente, senza passare per qualcosa come una classe.
Puoi scrivere funzioni che richiedono che i suoi oggetti argomento abbiano determinati metodi (e che quei metodi abbiano determinati tipi); ad esempio, il metodo seguente accetta un argomento che è qualsiasi oggetto con un metodo "quot" bar ":
let foo x = x#bar
Altri suggerimenti
C'è una discussione su " Abbinamento di oggetti con motivi " su Lambda the Ultimate (il documento utilizza Scala come lingua, quindi non risponderà al tuo domanda). Un thread Ocaml più pertinente a> indica che non esiste RTTI / downcasting sicuro per gli oggetti.
Per i tipi algebrici (non oggetto) hai ovviamente:
match expr with
Type1 x -> x
Type2 (x,y) -> y
chiamato (pattern) matching
Qualcuno ha scritto un'estensione che consente il down / up-casting di oggetti Ocaml.
In breve, devi codificare il tuo meccanismo RTTI. OCaml non fornisce RTTI o casting up / down (quest'ultimo in parte perché ereditarietà e sottotipizzazione sono ortogonali in OCaml piuttosto che unificati come in Java).
Potresti fare qualcosa con stringhe o varianti polimorfiche per codificare le informazioni sui tipi nelle tue classi e oggetti. Credo che LablGTK faccia un po 'di tutto questo e fornisca una libreria di utilità per supportare la codifica degli oggetti e il casting up / down.
Un po 'fuori tema, ma il linguaggio OPA (che attinge fortemente da alcuni aspetti di OCaml) , consente l'equivalente del pattern-matching sugli oggetti. Quindi è abbastanza fattibile.