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
Respuesta
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
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.
estoy teniendo dificultades para conseguir que esto funcione. Hice coincidencia de patrones para valores dentro de un tipo pero no en varios. –
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. –
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.
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.
- 1. Comprobación de subcadenas en Ocaml
- 2. Objetos dentro de objetos en OCaml
- 3. enteros de nivel de tipo en ocaml
- 4. OCaml tipo del operador plus
- 5. Comprobación del tipo de Prolog
- 6. declaración de tipo de OCaml (ml/MLI)
- 7. fusión recursiva de cola tipo en OCaml
- 8. Extender un tipo existente en OCaml
- 9. Comprobación para el tipo de control
- 10. Mejor tipo comprobación de coincidencia en Scala
- 11. JSR-303 Tipo Comprobación Antes Encuadernación
- 12. error de sintaxis OCaml de declaración de tipo
- 13. Error de tipo de inferencia/comprobación de tipo al utilizar cálculos de tipo de nivel
- 14. tipo de polimorfismo dentro de un módulo (OCaml)
- 15. Factoring asignaciones de tipo de producto en OCaml
- 16. ¿Qué tipo de ocaml 'a. 'a ->' una media?
- 17. matriz de un tipo con un parámetro en Ocaml
- 18. Ocaml: Exportación de un tipo en un archivo MLI
- 19. Eliminar objetos de tipo incompleto
- 20. Patrones de diseño para la comprobación de tipo estático
- 21. OCaml: Funciones de árbol
- 22. Comprobación del tipo de un enlace en Sitecore
- 23. Comprobación de la sizeof un tipo entero en el preprocesador
- 24. Ocaml: Error - esta expresión tiene tipo X, pero se utiliza con el tipo de x
- 25. Implementación de Ocaml
- 26. valores de retorno OCaml
- 27. Comprobación de tipos estáticos en erlang
- 28. OCaml firmas de tipos explícitas
- 29. Imponer comprobación de tipo fuerte en C (rigurosidad de tipo para typedefs)
- 30. temporizador genérica en OCaml
Podría publicar algo de código, ya que normalmente se conoce el tipo de objeto que se va a procesar se – 0xFF