2010-08-22 3 views

Répondre

9

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

1

Regardez à matchure bibliothèque - il devrait être inclus dans clojure-contrib dans le temps près

0

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.

3

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.

Questions connexes