2009-09-15 9 views
7

Si tengo un objeto, ¿cómo puedo determinar su tipo? (¿Hay un OCaml equivalente al operador de Java instanceof?)OCaml: Tipo Comprobación de objetos

+0

Podría publicar algo de código, ya que normalmente se conoce el tipo de objeto que se va a procesar se – 0xFF

Respuesta

7

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

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

let foo x = x#bar 
4

Hay una discusión de "Matching Objects With Patterns" en Lambda the Ultimate (el documento utiliza Scala como la lengua, por lo que no va a responder a su pregunta). Un Ocaml mailing list thread más relevante indica que no hay RTTI/downcasting seguro para los objetos.

Para algebraica (no objeto) tipos que obviamente tienen:

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

llamados (pattern) matching

Alguien escribió una extension que permite bajar objetos ocaml/arriba de fundición a presión.

+0

estoy teniendo dificultades para conseguir que esto funcione. Hice coincidencia de patrones para valores dentro de un tipo pero no en varios. –

+0

Hay una diferencia entre los objetos y los tipos algebraicos. La mayoría de las personas parece preferir evitar los objetos de Ocaml y usar funtores + tipos algebraicos para la genérica. –

1

En pocas palabras, usted tiene que codificar su propio mecanismo de RTTI. OCaml no proporciona RTTI ni conversión ascendente/descendente (esta última en parte porque la herencia y el subtipado son ortogonales en OCaml en lugar de unificados como en Java).

se podría hacer algo con cuerdas 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 utilidad para admitir el etiquetado de objetos y el fundido ascendente/descendente.

0

Un poco fuera de tema, pero the OPA language (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.

Cuestiones relacionadas