Clojure代数数据类型
我在中找到了Clojure代数数据类型,clojure,algebraic-data-types,Clojure,Algebraic Data Types,我在中找到了defadt宏。不幸的是,clojure中没有关于ADT使用的有用文档。我在谷歌上搜索了几个小时,找到了一些关于它的小信息。clojure中的ADT是什么?如何使用它们?任何信息都会很有用:)一些信息可以在src/clojure/contrib/types文件中找到。它显示了定义为adt的树结构示例: (defadt ::tree empty-tree (leaf value) (node left-tree right-tree)) 源文件中有更多信息。Clojure
defadt
宏。不幸的是,clojure中没有关于ADT使用的有用文档。我在谷歌上搜索了几个小时,找到了一些关于它的小信息。clojure中的ADT是什么?如何使用它们?任何信息都会很有用:)一些信息可以在src/clojure/contrib/types文件中找到。它显示了定义为adt的树结构示例:
(defadt ::tree
empty-tree
(leaf value)
(node left-tree right-tree))
源文件中有更多信息。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)
这很酷 defadt不赞成吗?