Ogni volta che in Haskell abbiamo bisogno di alcuni tipi di dati varianti, utilizzeremmo le ADT insieme alla corrispondenza dei modelli. Che cosa usano i Clojure per tali casi?Sostituzione del clojure per ADT e Pattern Matching?
risposta
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
Guardate di matchure biblioteca - dovrebbe essere incluso in clojure-contrib in tempo quasi
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.
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.