OCaml: проверка типов объектов
-
07-07-2019 - |
Вопрос
Если у меня есть объект, как я могу определить его тип? (Есть ли в 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) , допускает эквивалент сопоставления с образцом на объектах. Так что это вполне возможно.