Pergunta

Se eu tiver um objeto, como posso determinar o seu tipo? (Existe uma OCaml equivalente ao operador instanceof de Java?)

Foi útil?

Solução

OCaml tem digitação estrutural para objetos em vez de digitação nominativas como em Java. Assim, o tipo de um objecto é basicamente determinada (e apenas determinada) por seus métodos. Objetos em OCaml podem ser criados diretamente, sem passar por algo como uma classe.

Você pode escrever funções que exigem que seus objetos de argumento tem certos métodos (e que esses métodos têm certos tipos); por exemplo, o seguinte método recebe um argumento que é qualquer objeto com um método de "bar":

let foo x = x#bar

Outras dicas

Há uma discussão sobre "objetos combinando com padrões" em Lambda the Ultimate (o papel usa Scala como a língua, por isso não vai responder a sua pergunta ). A Ocaml lista de discussão segmento mais relevante indica que não há nenhuma RTTI / safe-downcasting para objetos.

Para tipos algébricos (não objeto) você obviamente tem:

match expr with 
  Type1 x -> x
  Type2 (x,y) -> y

(padrão) correspondente

Alguém fez escrever um extensão , que permite down / up-casting Ocaml objetos.

Em suma, você tem que codificar o seu próprio mecanismo de RTTI. OCaml não fornece nenhuma RTTI ou para cima / baixo carcaça (o último em parte porque herança e subtipos são ortogonais em OCaml em vez de unificada como em Java).

Você poderia fazer algo com cordas ou variantes polimórficas para informações de tipo de codificação em suas classes e objetos. Acredito que LablGTK serão algumas delas, e fornece uma biblioteca de utilitários para suporte objeto tagging e up / down casting.

Um pouco fora de tópico, mas linguagem OPA (que inspira-se fortemente a partir de alguns aspectos da OCaml) , permite que o equivalente a pattern-matching em objetos. Portanto, é bastante viável.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top