Si j'ai un objet, comment puis-je déterminer son type? (Y a-t-il un équivalent OCAML pour l'instance code> d'instance de Java de Java?) P>
4 Réponses :
Il y a une discussion sur "Objets correspondants avec motifs" sur lambda le ultime (le papier utilise Scala comme langue, donc ne répondra pas à votre question. ). Plus pertinent thread de liste de diffusion OCAML a> indique qu'il n'y a pas de RTTI / Safe-Downcasting pour les objets. pour les types algébriques (non d'objet) Vous avez évidemment: p> appelé (motif) correspondant p> Quelqu'un a écrit un Extension qui permet des objets OCAML Down / Up-Casting. P> P >
J'ai du mal à faire travailler ça. J'ai fait le motif correspondant à des valeurs dans un type mais pas à travers plusieurs.
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 + des types algébriques pour la générosité.
OCAML a la typographie structurelle pour les objets plutôt que sur la typographie nominative comme dans Java. Donc, le type d'objet est essentiellement déterminé (et seulement déterminé) par ses méthodes. Les objets dans OCAML peuvent être créés directement, sans passer quelque chose comme une classe.
Vous pouvez écrire des fonctions qui nécessitent que ses objets d'argument aient certaines méthodes (et que ces méthodes ont certains types); Par exemple, la méthode suivante prend un argument qui est n'importe quel objet avec une méthode "bar": p>
J'essaie de faire des comparaisons avec Coq. En Coq, il est facile de voir les types de choses avec check chose. Code> par exemple Pour l'identité polymorphe Funciton
Cochez Fun Fun {T: Type} (x: T) => x. code> retourne
amusement (T: Type) (x: T) => x: Forall T: Type, T -> T Code>. Puis-je faire cela dans OCAML? par exemple. vérifier mes définitions et trucs comme ça?
En bref, vous devez coder votre propre mécanisme RTTI. OCAML ne fournit aucune coulée RTTI ou UP / DOWN (ce dernier en partie en partie parce que l'héritage et le sous-typant sont orthogonaux dans OCAML plutôt que d'unifié comme dans Java). P>
Vous pouvez faire quelque chose avec des chaînes ou des variantes polymorphes pour coder les informations de type dans vos classes et objets. Je crois que Lablgtk en fait une partie de cela, et fournit une bibliothèque utilitaire pour soutenir le marquage de l'objet et la coulée de haut / bas. P>
Un peu hors de sujet, mais La langue de l'OPA (qui attire lourdement de certains aspects de OCAML) , permet l'équivalent de la correspondance de patterns sur des objets. Donc, c'est assez réalisable. P>
Pourriez-vous publier du code, car normalement, vous connaissez le type d'objet lorsque vous le traiterez