OCaml: Проверка Типов Объектов


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

4 7

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), позволяет эквивалентно сопоставлять шаблоны на объектах. Так что это вполне осуществимо.