Вопрос

Если у меня есть объект, как я могу определить его тип? (Есть ли в OCaml эквивалент оператора Java instanceof ?)

Это было полезно?

Решение

OCaml имеет структурную типизацию для объектов, а не номинативную типизацию, как в Java. Таким образом, тип объекта в основном определяется (и определяется только) его методами. Объекты в OCaml можно создавать напрямую, не проходя что-то вроде класса.

Вы можете написать функции, которые требуют, чтобы у объектов-аргументов были определенные методы (и чтобы у этих методов были определенные типы); например, следующий метод принимает аргумент, который является любым объектом с методом " bar ":

let foo x = x#bar

Другие советы

Обсуждается " Сопоставление объектов с шаблонами " на Lambda the Ultimate (статья использует Scala в качестве языка, поэтому не буду отвечать на ваши вопрос). Более актуальная ветка списка рассылки Ocaml означает, что для объектов нет RTTI / безопасного понижения рейтинга.

Для алгебраических (не объектных) типов у вас, очевидно, есть:

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

называется (сопоставление с шаблоном)

Кто-то написал расширение это позволяет понижать / повышать качество объектов Ocaml.

Короче говоря, вы должны закодировать свой собственный механизм RTTI. OCaml не обеспечивает RTTI или приведение вверх / вниз (последнее отчасти потому, что наследование и подтипы являются ортогональными в OCaml, а не унифицированными, как в Java).

Вы можете сделать что-то со строками или полиморфными вариантами, чтобы кодировать информацию о типе в ваших классах и объектах. Я считаю, что LablGTK кое-что делает и предоставляет служебную библиотеку для поддержки тегов объектов и приведения вверх / вниз.

Несколько не по теме, но язык OPA (который в значительной степени опирается на некоторые аспекты OCaml) , допускает эквивалент сопоставления с образцом на объектах. Так что это вполне возможно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top