2009-09-15 19 views
7

Wenn ich ein Objekt habe, wie kann ich seinen Typ feststellen? (Gibt es ein OCaml entspricht Java instanceof Operator?)OCaml: Typ prüfen Objekte

+0

könnten Sie etwas Code posten, weil Sie normalerweise den Objekttyp kennen, wenn Sie ihn bearbeiten – 0xFF

Antwort

7

OCaml hat strukturelle Typisierung für Objekte anstelle von Nominativ Typisierung wie in Java. Der Typ eines Objekts wird also grundsätzlich durch seine Methoden bestimmt (und nur bestimmt). Objekte in OCaml können direkt erstellt werden, ohne etwas wie eine Klasse zu durchlaufen.

Sie können Funktionen schreiben, die erfordern, dass ihre Argumentobjekte bestimmte Methoden haben (und dass diese Methoden bestimmte Typen haben); nimmt beispielsweise das folgende Verfahren ein Argument, das jedes Objekt mit einer Methode „bar“ ist:

let foo x = x#bar 
4

Es gibt eine Diskussion über "Matching Objects With Patterns" auf Lambda the Ultimate (das Papier verwendet Scala als Sprache, so wird Ihre Frage nicht beantworten). Eine relevantere Ocaml mailing list thread zeigt an, dass es keine RTTI/Safe-Downcasting für Objekte gibt.

Für algebraische (non-Objekt) Typen haben Sie offensichtlich:

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

(pattern) matching genannt

Jemand hat eine extension schreiben,/ermöglicht down up-Casting Ocaml Objekte.

+0

Ich habe eine harte Zeit, damit dies funktioniert. Ich habe einen Mustervergleich für Werte innerhalb eines Typs durchgeführt, aber nicht für mehrere. –

+0

Es gibt einen Unterschied zwischen Objekten und algebraischen Typen. Die meisten Menschen scheinen es vorzuziehen, Ocamls Objekte zu vermeiden und Funktoren + algebraische Typen für die Generizität zu verwenden. –

1

Kurz gesagt, müssen Sie Ihren eigenen RTTI-Mechanismus kodieren. OCaml bietet keine RTTI oder Up/Down Casting (letzteres zum Teil, weil Vererbung und Subtyping in OCaml eher orthogonal als in Java vereinheitlicht sind).

Sie könnten etwas mit Strings oder polymorphen Varianten machen, um Typinformationen in Ihren Klassen und Objekten zu kodieren. Ich glaube, dass LablGTK einiges davon tut und eine Utility-Bibliothek zur Unterstützung von Objekt-Tags und Up/Down-Castings bietet.

0

Etwas out-of-topic, aber the OPA language (die stark von einigen Aspekten von OCaml bezieht), ermöglicht das Äquivalent von Mustervergleich auf Objekten. Es ist also durchaus machbar.