在Clojure中有一个非常有趣的ADT示例here:
我们定义一个这样的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)
这很酷。
现在我觉得匹配Haskell等同物时缺少一些东西,但我无法完全理解它是什么。
我的问题是:在Clojure中实现ADT需要什么?
答案 0 :(得分:0)
要在clojure中实施ADT,您需要勇敢坚持。
对于缺失的部分 - 我不知道你错过了什么,但我知道我经常缺少什么。
1)我想自动获得一些foldX
- 函数来执行转换为Boehm编码 - 这种数据类型的自然折叠。
但是,这将要求您让用户指定哪些字段必须引用相同类型的对象(在您的情况下为left
和right
)。
例如,为haskell中的示例类型编写的函数(上帝保存懒惰!)将如下所示:
foldTree :: a -> (v -> a) -> (a -> a -> a) -> Tree v -> a
foldTree empty value node = go
where
go tree =
case tree of
Empty -> empty
Value v -> value v
Node l r -> node (go l) (go r)
据我所知,这是在Coq中完成的,并称为" induction"。
2)我希望所有分支都看到像isEmpty
这样的谓词。认真。提供这些语言的唯一语言是Pyret。
3)对于奖励积分,我还希望能够derive
结构Eq
uality,Ord
ering,to-and--string conversion。
∞-1)为了拥有自己的灵魂,您还可以相应地自动生成镜头和棱镜到所有领域和分支。
∞)为了证明你自己的力量,你也可以产生ana-,para-和apomorphisms,因为foldX
已经是一个同态。