Clojure代数数据类型

我在clojure.contrib.types中找到了defadt宏。 不幸的是,在clojure中没有关于ADT用法的有用文档。 我搜索了几个小时,发现了关于它的小部分信息。 clojure中的ADT是什么? 如何使用它们? 任何信息都会有帮助:)


有些信息可以在src / clojure / contrib / types中的examples.clj文件中找到。 它显示了一个定义为adt的树结构的例子:

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

更多信息在源文件中。


ADT在Clojure中有一个非常有趣的例子:

我们这样定义一个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)

这很酷。

链接地址: http://www.djcxy.com/p/5745.html

上一篇: Clojure algebraic data types

下一篇: HOWTO create OpenGL ES 2.0 SkyBox?