2016-07-04 5 views
1

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?

+2

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

Antwort

0

Um ADT in clojure zu implementieren, müssen Sie mutig und hartnäckig sein.

Für die fehlenden Teile - ich weiß nicht, was Sie vermissen, aber ich weiß, was ich normalerweise vermisse.

1) Ich möchte authomatisch einige foldX-Funktion zur Konvertierung in Boehm Codierung - eine natürliche Falte für diesen Datentyp durchführen.

Dies erfordert jedoch, dass Sie einen Benutzer angeben müssen, welche Felder auf Objekt desselben Typs verweisen müssen (left und right in Ihrem Fall).

Zum Beispiel der Funktion, geschrieben für Ihr Beispiel Typen in Haskell (Gott die Faulheit retten!) Wird wie folgt aussehen:

foldTree :: a -> (v -> a) -> (a -> a -> a) -> Tree v -> a 
foldTree empty value node = go 
    where 
    go tree = 
     case tree of 
     Empty -> empty 
     Value v -> value v 
     Node l r -> node (go l) (go r) 

Dies ist in Coq getan, wie ich weiß, und „Induktion“ genannt .

2) Ich möchte Prädikate wie isEmpty für alle Zweige sehen. Ernst. Die einzige Sprache, die sie bietet, ist Pyret.

3) Für Bonuspunkte, mag ich auch eine gewisse Fähigkeit zu derive strukturellen Eq uality haben, Ord Ering, to- und aus-String-Konvertierung.

∞-1) Um meine Seele zu besitzen, können Sie auch Linsen und Prismen automatisch in alle Felder und Zweige entsprechend erzeugen.

To) Um Ihre eigene Stärke zu beweisen, können Sie auch Ana-, Para- und Apomorphismen erzeugen, da foldX bereits eine Katamorphose ist.

Verwandte Themen