我在clojure.contrib.types中找到了defadt
宏。不幸的是,在clojure中没有关于ADT使用的有用文档。我用谷歌搜索了几个小时,发现了一些关于它的信息。 clojure中的ADT是什么?怎么用?任何信息都会有所帮助:)
答案 0 :(得分:2)
可以在src / clojure / contrib / types中的examples.clj文件中找到一些信息。它显示了一个定义为adt的树结构示例:
(defadt ::tree
empty-tree
(leaf value)
(node left-tree right-tree))
源文件中的更多信息。
答案 1 :(得分:1)
在Clojure here中有一个非常有趣的ADT示例:
我们定义一个这样的ADT生成器:
(defmacro data
[adt-name equals-sign & constructors]
`(do
(defn ~(symbol (str adt-name "?")) [~'obj]
(= ~(str adt-name) (adt-name ~'obj)))
~@(for [[type-name & fields]
(filter (partial not= '(|))
(partition-by (partial = '|) constructors))]
(apply (partial emit-constructor adt-name type-name)
fields))))
给出Haskell示例:
data Tree a = Empty
| Leaf a
| Node Tree Tree
然后我们写Clojure
(data Tree = Empty | Leaf value | Node left right)
这很酷。