Annahme: Ich kenne die ADT Bibliotheken here. Sie sind cool. Vielleicht könnten sie besser sein.Was ist erforderlich, um einen ADT in Clojure zu implementieren?
Es von ADT in Clojure ein wirklich interessantes Beispiel ist here:
Wir definieren einen ADT-Generator wie folgt aus:
(defmacro data
[adt-name equals-sign & constructors]
`(do
(defn ~(symbol (str adt-name "?")) [~'obj]
(= ~(str adt-name) (adt-name ~'obj)))
[email protected](for [[type-name & fields]
(filter (partial not= '(|))
(partition-by (partial = '|) constructors))]
(apply (partial emit-constructor adt-name type-name)
fields))))
das Haskell Beispiel Gegeben:
data Tree a = Empty
| Leaf a
| Node Tree Tree
Dann schreiben wir die Clojure
(data Tree = Empty | Leaf value | Node left right)
Welches ist ziemlich cool.
Jetzt habe ich das Gefühl, dass etwas fehlt, das dem Haskell-Äquivalent entspricht, aber ich kann nicht genau sagen, was es ist.
Meine Frage ist: Was ist erforderlich, um eine ADT in Clojure zu implementieren?
ist kein ADT ohne eine geprüfte Typen mehr oder weniger nutzlos? Ich schätze, du könntest die ADT als Katamorphose darstellen ... (Übrigens: das Muster-Matching/Katamorphismus, um Werte zu verwenden, würde ich als vermisst betrachten - natürlich verstehe ich Clojure überhaupt nicht, vielleicht ist es auch * irgendwie * ausgesandt) – Carsten