2009-09-15 5 views
7

Si j'ai un objet, comment puis-je déterminer son type? (Existe-t-il un OCaml équivalent à l'opérateur instanceof de Java?)OCaml: Type Vérification des objets

+0

pouvez-vous poster du code, parce que normalement vous connaissez le type d'objet lorsque vous le traitez – 0xFF

Répondre

7

OCaml a un typage structurel pour les objets plutôt qu'un typage nominatif comme en Java. Donc le type d'un objet est fondamentalement déterminé (et seulement déterminé) par ses méthodes. Les objets dans OCaml peuvent être créés directement, sans passer par quelque chose comme une classe.

Vous pouvez écrire des fonctions qui requièrent que leurs objets arguments aient certaines méthodes (et que ces méthodes aient certains types); par exemple, la méthode suivante prend un argument qui est un objet avec une méthode « bar »:

let foo x = x#bar 
4

Il y a une discussion de "Matching Objects With Patterns" sur Lambda the Ultimate (le papier utilise Scala comme langue, donc ne répondra pas à votre question). Un plus pertinent Ocaml mailing list thread indique qu'il n'y a pas de RTTI/safe-downcasting pour les objets.

algébriques (objet non) types vous avez évidemment:

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

appelé (pattern) matching

Quelqu'un avait écrit un extension qui permet vers le bas/objets Ocaml up-casting.

+0

J'ai du mal à faire fonctionner ça. J'ai fait un modèle de correspondance pour les valeurs d'un type mais pas pour plusieurs. –

+0

Il y a une différence entre les objets et les types algébriques. La plupart des gens semblent préférer éviter les objets d'Ocaml et utiliser des foncteurs + types algébriques pour la généricité. –

1

En bref, vous devez encoder votre propre mécanisme RTTI. OCaml ne fournit pas de transtypage RTTI ou de conversion ascendante/descendante (ce dernier en partie parce que l'héritage et le sous-typage sont orthogonaux dans OCaml plutôt que unifiés comme dans Java).

Vous pouvez faire quelque chose avec des chaînes ou des variantes polymorphes pour encoder des informations de type dans vos classes et objets. Je crois que LablGTK fait une partie de ceci, et fournit une bibliothèque d'utilité pour soutenir le balisage d'objet et la coulée haut/bas.

0

Un peu hors-sujet, mais the OPA language (qui s'inspire fortement de certains aspects de OCaml), permet l'équivalent de la correspondance de modèle sur des objets. Donc c'est tout à fait faisable.

Questions connexes