Clojure代数数据类型

8
我在clojure.contrib.types中找到了defadt宏。不幸的是,在clojure中使用ADT没有有用的文档。我已经谷歌了几个小时,只找到了一些微小的信息。什么是clojure中的ADT?如何使用它们?任何信息都将有所帮助 :)
2个回答

2

一些信息可以在src/clojure/contrib/types目录下的examples.clj文件中找到。该文件展示了一个树形结构的ADT定义示例:

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

更多信息请参阅源文件。


2
defadt已经被弃用了吗? - Didier A.

2

这里有一个关于Clojure中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)

这很酷。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接