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
Répondre
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
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.
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. –
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é. –
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.
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.
- 1. Vérification des objets sérialisés
- 2. Vérification de type sur les objets Caché
- 3. UML pour OCaml objets immédiats
- 4. Fonctions récursives dans les objets OCaml
- 5. OCaml: Pourquoi ce code produit-il une erreur de vérification de type?
- 6. Générique DuplicateValidationRule (Vérification des objets métier pour les doublons)
- 7. OCaml: Vérifier la liste des dossiers d'adhésion
- 8. Gestion des dépendances circulaires dans OCaml
- 9. C# objet dynamique d'exécution de type Vérification
- 10. Functors in Ocaml
- 11. OCaml: Comment fonctionne List.fold_left?
- 12. Ocaml - Itératif à récursion
- 13. Récupérer uniquement des objets de type base dans nHibernate
- 14. Ocaml: Erreur - cette expression est de type x mais est utilisé avec le type x
- 15. Comparer deux objets avec une vérification de null
- 16. Ocaml valeurs Int et négatives
- 17. OCaml: Définir les modules
- 18. Question OAM de base OCaml
- 19. Type de tableau à plusieurs objets?
- 20. Vérification de l'état des machines?
- 21. Solution de vérification des liens
- 22. Modèle de conception de visiteur dans OCaml
- 23. Envelopper ma tête autour OCaml
- 24. OCaml typage structurel et listes
- 25. Objets et gestion des erreurs en PHP
- 26. Réflexion - obtention des propriétés des objets imbriqués
- 27. Types OCaml avec différents niveaux de spécificité
- 28. Membres de données OCaml sans initialisation
- 29. Comment spécifier des alias de type et des objets dans un fichier de configuration Spring.NET externe
- 30. OCaml: Correspond à l'expression dans un autre?
pouvez-vous poster du code, parce que normalement vous connaissez le type d'objet lorsque vous le traitez – 0xFF