在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)挺酷的。
现在我觉得在匹配Haskell上缺少了一些东西,但是我不能完全理解它是什么。
我的问题是:在Clojure中实现ADT需要什么?
发布于 2016-07-04 17:09:59
要在clojure中实现ADT,您需要勇敢和坚持。
关于丢失的部分-我不知道你缺少什么,但我知道我通常错过什么。
1)我想真实地获得一些foldX-function来执行到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中完成的,并被称为“归纳”。
2)我希望看到像isEmpty这样的谓词用于所有分支。我是认真的。提供它们的唯一语言是Pyret。
3)对于加分,我也希望有一些能力,derive结构Eq,Ordering,to-和from-string转换。
∞-1)为了拥有我的灵魂,你也可以自动地在所有的领域和分支中产生透镜和棱镜。
为了证明你自己的力量,你也可以产生ana-,对-和同态,因为foldX已经是一个变态。
https://stackoverflow.com/questions/38180978
复制相似问题