2011-03-25 35 views
6

我發現defadtclojure.contrib.types。不幸的是,在clojure中沒有關於ADT用法的有用文檔。我搜索了幾個小時,發現了關於它的小部分信息。 clojure中的ADT是什麼?如何使用它們?任何信息都將是有益的:)Clojure的代數數據類型

回答

2

一些信息可以在examples.clj文件中的src/Clojure的/的contrib /類型中找到。它顯示了一個定義爲adt的樹結構的示例:

(defadt ::tree 
    empty-tree 
    (leaf value) 
    (node left-tree right-tree)) 

更多信息在源文件中。

+1

是defadt過時? – 2017-03-20 18:19:55

1

有ADT公司的Clojure中here一個非常有趣的例子:

我們定義一個ADT發生器是這樣的:

(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)))) 

鑑於哈斯克爾例如:

data Tree a = Empty 
     | Leaf a 
     | Node Tree Tree 

然後我們寫Clojure的

(data Tree = Empty | Leaf value | Node left right) 

這是很酷。