OCaml: objetos de comprobación de tipo
-
07-07-2019 - |
Pregunta
Si tengo un objeto, ¿cómo puedo determinar su tipo? (¿Existe un OCaml equivalente al operador instanceof
de Java?)
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.