2009-09-15 18 views
7

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

+0

potresti pubblicare del codice, perché normalmente conosci il tipo di oggetto quando lo stai elaborando. – 0xFF

risposta

7

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 
4

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.

+0

Ho difficoltà a farlo funzionare. Ho eseguito la corrispondenza dei modelli per valori all'interno di un tipo, ma non su diversi. –

+0

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à. –

1

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.

0

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.