OCaml: Проверка Типов Объектов
Если у меня есть объект, как я могу определить его тип? (Существует ли OCaml, эквивалентный оператору Java instanceof
?)
4 ответа:
OCaml имеет структурную типизацию для объектов, а не номинативную типизацию, как в Java. Таким образом, тип объекта в основном определяется (и только определяется) его методами. Объекты в OCaml можно создавать напрямую, не проходя через что-то вроде класса.
Можно написать функции, которые требуют, чтобы их объекты аргументов имели определенные методы (и чтобы эти методы имели определенные типы); например, следующий метод принимает аргумент, который является любым объектом с методом "бар":
let foo x = x#bar
Есть обсуждение "сопоставления объектов с паттернами" на Lambda The Ultimate (статья использует Scala в качестве языка, поэтому не будет отвечать на ваш вопрос). Более релевантныйпоток списка рассылки Ocaml указывает, что для объектов нет RTTI/safe-downcasting.
Для алгебраических (не объектных) типов у вас, очевидно, есть:
match expr with Type1 x -> x Type2 (x,y) -> y
Называется (шаблон) соответствие
Кто-то написал расширение , которое позволяет выполнять down / up-casting Ocaml объекты.
Короче говоря, вы должны кодировать свой собственный механизм RTTI. OCaml не предоставляет RTTI или up/down приведение (последнее частично потому, что наследование и подтипирование ортогональны в OCaml, а не унифицированы, как в Java).
Вы можете что-то сделать со строками или полиморфными вариантами для кодирования информации о типах в ваших классах и объектах. Я считаю, что LablGTK выполняет некоторые из этих функций и предоставляет служебную библиотеку для поддержки тегирования объектов и приведения вверх/вниз.
Несколько не по теме, но язык OPA (который сильно опирается на некоторые аспекты OCaml), позволяет эквивалентно сопоставлять шаблоны на объектах. Так что это вполне осуществимо.