Domanda

Se ho un oggetto, come posso determinarne il tipo? (Esiste un OCaml equivalente all'operatore instanceof di Java?)

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top