Pregunta

Si tengo un objeto, ¿cómo puedo determinar su tipo? (¿Existe un OCaml equivalente al operador instanceof de Java?)

¿Fue útil?

Solución

OCaml tiene escritura estructural para objetos en lugar de escritura nominativa como en Java. Entonces, el tipo de un objeto está básicamente determinado (y solo determinado) por sus métodos. Los objetos en OCaml se pueden crear directamente, sin pasar por algo así como una clase.

Puede escribir funciones que requieran que sus objetos de argumento tengan ciertos métodos (y que esos métodos tengan ciertos tipos); por ejemplo, el siguiente método toma un argumento que es cualquier objeto con un método " bar " ;:

let foo x = x#bar

Otros consejos

Hay una discusión sobre " Coincidencia de objetos con patrones " en Lambda the Ultimate (el documento usa Scala como el idioma, así que no contestará su pregunta). Un hilo de la lista de correo de Ocaml más relevante indica que no hay RTTI / downcasting seguro para objetos.

Para los tipos algebraicos (no objeto) obviamente tiene:

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

llamada (patrón) coincidencia

Alguien escribió una extensión que permite bajar / subir objetos Ocaml.

En resumen, debe codificar su propio mecanismo RTTI. OCaml no proporciona RTTI o conversión ascendente / descendente (esto último en parte porque la herencia y el subtipo son ortogonales en OCaml en lugar de unificados como en Java).

Podría hacer algo con cadenas o variantes polimórficas para codificar información de tipo en sus clases y objetos. Creo que LablGTK hace algo de esto y proporciona una biblioteca de utilidades para admitir el etiquetado de objetos y la conversión hacia arriba / abajo.

Algo fuera de tema, pero el lenguaje OPA (que se basa en gran medida en algunos aspectos de OCaml) , permite el equivalente de la coincidencia de patrones en los objetos. Entonces es bastante factible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top