Frage

Wenn ich ein Objekt, wie kann ich seine Art bestimmen? (Gibt es ein OCaml entspricht Java instanceof Operator?)

War es hilfreich?

Lösung

OCaml hat strukturelle Typisierung für Objekte anstatt Nominativ Typisierung wie in Java. So ist der Typ eines Objekts wird im wesentlichen bestimmt (und nur) bestimmt durch seine Methoden. Objekte in OCaml können direkt erstellt werden, ohne dass wie eine Klasse durch etwas los.

Sie können Funktionen schreiben, die verlangen, dass seine Argumentation Objekte haben bestimmte Methoden (und dass diese Verfahren haben bestimmte Arten); nimmt beispielsweise das folgende Verfahren ein Argument, dass jedes Objekt mit einem Verfahren, „bar“ ist:

let foo x = x#bar

Andere Tipps

Es gibt eine Diskussion über „Passende Objekte mit Patterns“ auf Lambda the Ultimate (das Papier verwendet Scala als Sprache, so wird Ihre Frage nicht beantworten ). Ein relevanter Ocaml Mailingliste Thread zeigt an, dass es keine RTTI / safe-einziehe für Objekte.

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

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

(Muster) passend

Jemand hat einen Erweiterung Das erlaubt down / up-Casting Ocaml Objekte.

Kurz gesagt, müssen Sie Ihren eigenen RTTI-Mechanismus kodieren. OCaml bietet keine RTTI oder nach oben / unten Gießen (letztere zum Teil, weil Vererbung und Subtypisierung orthogonal ist in OCaml statt Unified wie in Java).

Sie könnten etwas mit Streichern oder polymorphen Varianten tun, um Typ-Informationen in Ihren Klassen und Objekten zu kodieren. Ich glaube, dass LablGTK einige dies tut, und bietet eine Dienstprogramm Bibliothek Objektkennzeichnung zu unterstützen und nach oben / unten Guss.

Etwas out-of-Thema, aber die OPA Sprache (die stark von einigen Aspekten der OCaml zieht) ermöglicht das Äquivalent von Musterabgleich auf Objekten. Es ist also durchaus möglich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top