在Clojure中实现ADT需要什么?

时间:2016-07-04 09:16:50

标签: haskell clojure adt

假设:我知道ADT个库here。他们很酷。也许他们会更好。

在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需要什么?

1 个答案:

答案 0 :(得分:0)

要在clojure中实施ADT,您需要勇敢坚持。

对于缺失的部分 - 我不知道你错过了什么,但我知道我经常缺少什么。

1)我想自动获得一些foldX - 函数来执行转换为Boehm编码 - 这种数据类型的自然折叠。

但是,这将要求您让用户指定哪些字段必须引用相同类型的对象(在您的情况下为leftright)。

例如,为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已经是一个同态。