2009-09-15 12 views
7

Jeśli mam obiekt, w jaki sposób mogę określić jego typ? (Czy istnieje odpowiednik OCaml do instanceof operatora Java?)OCaml: Type Checking Objects

+0

Czy możesz umieścić jakiś kod, ponieważ zwykle znasz typ obiektu podczas jego przetwarzania – 0xFF

Odpowiedz

7

OCaml ma typowanie strukturalne obiektów zamiast typowania numerycznego, jak w Javie. Tak więc typ obiektu jest zasadniczo określany (i określany tylko) za pomocą jego metod. Obiekty w OCaml można tworzyć bezpośrednio, bez przechodzenia przez coś w rodzaju klasy.

Można pisać funkcje, które wymagają, aby jego obiekty argumentów miały określone metody (i że te metody mają określone typy); Na przykład, poniższa metoda przyjmuje argument, który jest każdy obiekt o metodę „bar”:

let foo x = x#bar 
4

Jest omówienie "Matching Objects With Patterns" na Lambda the Ultimate (papier wykorzystuje Scala jako język, więc nie odpowie na zapytanie). Bardziej istotne Ocaml mailing list thread wskazuje, że nie ma RTTI/bezpiecznego downcasting dla obiektów.

Dla algebraicznych (nie obiekt) typy to oczywiście posiadać:

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

nazywa (pattern) matching

Ktoś miał napisać extension, który pozwala w dół/góra odlewania przedmiotów SML.

+0

Mam trudności z uruchomieniem tego. Zrobiłem dopasowywanie do wzorca wartości w jednym typie, ale nie w kilku. –

+0

Istnieje różnica między obiektami i typami algebraicznymi. Większość ludzi woli unikać obiektów Ocaml i używać funktorów + typów algebraicznych dla generyczności. –

1

Krótko mówiąc, trzeba zakodować swój własny mechanizm RTTI. OCaml nie dostarcza żadnego RTTI ani castingu w górę/w dół (ten ostatni częściowo dlatego, że dziedziczenie i podtyp są ortogonalne w OCaml zamiast ujednolicone jak w Javie).

Możesz zrobić coś ze strunami lub odmianami polimorficznymi, aby zakodować informacje o typach w twoich klasach i obiektach. Uważam, że LablGTK wykonuje niektóre z tych zadań i udostępnia bibliotekę narzędzi do obsługi tagowania obiektów i rzutowania w górę/w dół.

0

Nieco out-of-temat, ale the OPA language (które zostało w dużym stopniu od kilku aspektów SML), pozwala na równoważnik dopasowywania wzorców na obiektach. Jest to całkiem wykonalne.