首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Clojure中实现ADT需要什么?

在Clojure中实现ADT需要什么?
EN

Stack Overflow用户
提问于 2016-07-04 09:16:49
回答 1查看 670关注 0票数 1

假设:我知道ADT这里。他们很酷。也许他们会更好。

在Clojure 这里中有一个非常有趣的ADT示例

我们定义了这样一个ADT生成器:

代码语言:javascript
复制
(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示例:

代码语言:javascript
复制
data Tree a = Empty
        | Leaf a
        | Node Tree Tree

然后我们编写Clojure

代码语言:javascript
复制
(data Tree = Empty | Leaf value | Node left right)

挺酷的。

现在我觉得在匹配Haskell上缺少了一些东西,但是我不能完全理解它是什么。

我的问题是:在Clojure中实现ADT需要什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-04 17:09:59

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

关于丢失的部分-我不知道你缺少什么,但我知道我通常错过什么。

1)我想真实地获得一些foldX-function来执行到Boehm编码的转换--这是这种数据类型的自然折叠。

但是,这将要求用户指定哪些字段必须引用相同类型的对象(在本例中为leftright )。

例如,该函数是在haskell中为示例类型编写的(上帝保佑懒惰!)看起来像:

代码语言:javascript
复制
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中完成的,并被称为“归纳”。

2)我希望看到像isEmpty这样的谓词用于所有分支。我是认真的。提供它们的唯一语言是Pyret。

3)对于加分,我也希望有一些能力,derive结构EqOrdering,to-和from-string转换。

∞-1)为了拥有我的灵魂,你也可以自动地在所有的领域和分支中产生透镜和棱镜。

为了证明你自己的力量,你也可以产生ana-,对-和同态,因为foldX已经是一个变态。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38180978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档