Chaque fois que dans Haskell nous avons besoin d'un type de données variant, nous utilisons des ADT en conjonction avec la correspondance de modèle. Qu'est-ce que les gens de Clojure utilisent pour de telles utilisations?Remplacement de Clojure pour les ADT et la correspondance de modèle?
Répondre
Eh bien, il existe actuellement des bibliothèques de correspondance de modèles écrites pour Clojure. Les macros de Clojure rendent ce genre de chose possible. Matchure est l'un des plus récents. Il y a même quelques trucs pour ADTs in contrib. Si l'on ne tient pas compte de ce genre de choses, ce qui se rapproche le plus des ADT de Haskell dans le core Clojure, ce sont les nouveaux enregistrements et types de données de Clojure 1.2. Mais, à moins que vous n'ayez besoin des avantages qui découlent de l'utilisation d'un enregistrement ou d'un type de données, vous utiliserez généralement une carte. Clojure est un langage dynamique, donc vous n'obtiendrez pas de vérification de type statique si vous utilisez un enregistrement et de toute façon.
Clojure a une "déstructuration" qui rappelle celle de l'appariement de motifs, et qui est beaucoup utilisée dans le Clojure idiomatique. Voir this et this. Le premier est une réponse par le vôtre vraiment sur SO. ; P
Regardez à matchure bibliothèque - il devrait être inclus dans clojure-contrib dans le temps près
J'aime Yap très bien comme une bibliothèque de modèle correspondant.
Le fait d'avoir à la fois des mots-clés et des symboles rend la mise en œuvre très facile au-dessus d'une bibliothèque de correspondance de modèles.
Cela dépend un peu de ce que vous essayez de faire. Mais en supposant le cas commun de vouloir le comportement polymorphique en fonction du type de données, les protocoles sont souvent une bonne approche:
(defprotocol Fooable
(foo [x]))
(defrecord AType [avalue]
Fooable
(foo [x]
(println (str "A value: " (:avalue x)))))
(defrecord BType [avalue]
Fooable
(foo [x]
(println (str "B value: " (:bvalue x)))))
(foo (AType. "AAAAAA"))
=> A value: AAAAAA
(foo (BType. "BBBBBB"))
=> B value: BBBBBB
Dans ce contexte, le protocole définit efficacement l'ensemble des opérations que vous voulez sur votre ADT et les enregistrements définissent les valeurs possibles de l'ADT ainsi que le comportement polymorphique pour les fonctions de protocole.
- 1. correspondance de bit et remplacement
- 2. Caractères de remplacement Unicode pour la correspondance de texte
- 3. Correspondance de modèle Python
- 4. RegexKitLite Changement de motif de remplacement de la correspondance trouvée
- 5. ADT approprié pour les graphiques
- 6. Correspondance de modèle pour la fonction de lecture personnalisée
- 7. AIML correspondance de modèle - howto?
- 8. xsl: la correspondance de modèle ne trouve pas les correspondances
- 9. NSString simple correspondance de modèle
- 10. Expressions régulières JavaScript: correspondance et remplacement de plusieurs occurrences dans une correspondance
- 11. Requête de remplacement de modèle.
- 12. Correspondance de modèle T-SQL
- 13. modèle XSLT sélectionner et numéro correspondance
- 14. Correspondance de modèle à l'aide de décorateurs
- 15. Scénarisation shell pour effectuer une correspondance/remplacement d'expressions rationnelles
- 16. correspondance de modèle de script shell?
- 17. Substitution de variable dans la correspondance de modèle?
- 18. Remplacement du modèle MySQL
- 19. Clojure idiomatique pour les rapports de progrès?
- 20. Compilation et liaison de liste chaînée ADT
- 21. Les macros Clojure et la liaison de symboles
- 22. comparer les ensembles de données et retourner la meilleure correspondance
- 23. Remplacement par défaut Méthode de modèle utilisateur
- 24. Plugin ADT et Eclipse 3.5
- 25. Google appengine remplacement de la chaîne dans le fichier modèle
- 26. regex pour la recherche et le remplacement
- 27. bon ADT pour implémenter BTREE
- 28. Expression régulière pour la correspondance \ n et de l'espace
- 29. de remplacement pour configuration et de déploiement dans vb.net
- 30. Remplacement du modèle de règle Magento