2009-09-15 3 views
7

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

+0

Вы могли бы опубликовать некоторый код, потому что обычно вы знаете тип объекта, когда вы его обрабатываете. – 0xFF

ответ

7

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

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

let foo x = x#bar 
4

Там в обсуждении "Matching Objects With Patterns" на Lambda the Ultimate (статья использует Scala как язык, так что не будет отвечать на ваш вопрос). Более релевантный Ocaml mailing list thread указывает, что для объектов нет RTTI/safe-downcasting.

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

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

называется (pattern) matching

Кто-то написать extension, что позволяет вниз/вверх-литейные объекты OCaml.

+0

Мне нелегко заставить это работать. Я выполнил сопоставление образцов для значений внутри одного типа, но не для нескольких. –

+0

Существует различие между объектами и алгебраическими типами. Большинство людей, похоже, предпочитают избегать объектов Окамла и использовать функторы + алгебраические типы для универсальности. –

1

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

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

0

Немного вне темы, но the OPA language (что сильно опирается на некоторые аспекты OCaml), позволяет эквивалент соответствия шаблону объектам. Так что это вполне осуществимо.