2010-08-22 8 views

risposta

9

Bene, in realtà ci sono alcune librerie di pattern matching scritte per Clojure. I macro di Clojure rendono possibile questo tipo di cose. Matchure è uno dei più recenti. Ci sono anche alcune cose per ADTs in contrib.

Ignorando quella roba, la cosa più vicina che abbiamo agli ADT di Haskell nel core Clojure sono i nuovi record e tipi di dati in Clojure 1.2. Ma, a meno che non ti servano i vantaggi derivanti dall'utilizzo di un record o di un tipo di dati, di solito utilizzi solo una mappa. Clojure è un linguaggio dinamico, quindi non si otterrà il controllo di tipo statico se si utilizza un record e tale comunque.

Clojure ha una "destrutturazione" che ricorda il pattern matching e viene utilizzato molto nel Clojure idiomatico. Vedi this e this. Il primo è una tua risposta davvero qui su SO. ; P

1

Guardate di matchure biblioteca - dovrebbe essere incluso in clojure-contrib in tempo quasi

0

Mi piace Yap molto come una biblioteca pattern matching.

Il fatto di avere sia parole chiave che simboli rende la variante di implementazione abbastanza semplice su una libreria di pattern matching.

3

Dipende un po 'da quello che stai cercando di fare. Ma supponendo che il caso comune di voler comportamento polimorfico in base al tipo di dati, i protocolli sono spesso un buon approccio:

(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 

In questo contesto, il protocollo definisce in modo efficace l'insieme di operazioni che vuoi sul tuo ADT, e il record definiscono i possibili valori dell'ADT e il comportamento polimorfico per le funzioni del protocollo.