OCaml: проверка типов объектов - PullRequest
7 голосов
/ 15 сентября 2009

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

Ответы [ 4 ]

7 голосов
/ 15 сентября 2009

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

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

let foo x = x#bar
5 голосов
/ 15 сентября 2009

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

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

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

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

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

1 голос
/ 16 сентября 2009

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

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

0 голосов
/ 16 января 2010

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

...