Haskell Clojure';s替代哈斯克尔';s ADT和模式匹配?
在Haskell中,每当我们需要一些变量数据类型时,我们都会与模式匹配结合使用。Clojure人在这种用例中使用了什么?实际上,有一些模式匹配库是为Clojure编写的。Clojure的宏使这类事情成为可能。是最近的一次。甚至还有一些东西是给你的 抛开这些东西不谈,最接近核心Clojure中Haskell的ADT的是Clojure 1.2中的新记录和数据类型。但是,除非您需要使用记录或数据类型带来的好处,否则您通常只使用映射。Clojure是一种动态语言,所以如果使用记录之类的东西,就不会进行静态类型检查Haskell Clojure';s替代哈斯克尔';s ADT和模式匹配?,haskell,clojure,functional-programming,pattern-matching,abstract-data-type,Haskell,Clojure,Functional Programming,Pattern Matching,Abstract Data Type,在Haskell中,每当我们需要一些变量数据类型时,我们都会与模式匹配结合使用。Clojure人在这种用例中使用了什么?实际上,有一些模式匹配库是为Clojure编写的。Clojure的宏使这类事情成为可能。是最近的一次。甚至还有一些东西是给你的 抛开这些东西不谈,最接近核心Clojure中Haskell的ADT的是Clojure 1.2中的新记录和数据类型。但是,除非您需要使用记录或数据类型带来的好处,否则您通常只使用映射。Clojure是一种动态语言,所以如果使用记录之类的东西,就不会进行静
Clojure有“destructuring”,这让人联想到模式匹配,并且在惯用的Clojure中被大量使用。见和。前者是你真正的答案,依此类推;p查找库-它应该在不久的将来包含在clojure contrib中我非常喜欢yap作为一个模式匹配库
同时拥有关键字和符号的事实使得在模式匹配库的基础上实现variant非常容易。这在一定程度上取决于您正在尝试做什么。但假设需要基于数据类型的多态行为,协议通常是一种好方法:
(defprotocol Fooable
(foo [x]))
(defrecord AType [avalue]
Fooable
(foo [x]
(println (str "A value: " (:avalue x)))))
(defrecord BType [avalue]
Fooable
(foo [x]
(println (str "B value: " (:bvalue x)))))
(foo (AType. "AAAAAA"))
=> A value: AAAAAA
(foo (BType. "BBBBBB"))
=> B value: BBBBBB
在这种情况下,协议有效地定义了您想要在ADT上执行的操作集,记录定义了ADT的可能值以及协议函数的多态行为。可以使用多方法和宏 下面可以找到一个例子 那么它们在Clojure中看起来如何? 此ADT实现将使用的语法如下所示:
(defadt树
(空)
(叶值)
(节点左/右)
这种语法与Haskell代码非常相似。我们还将看到,我们可以这样定义上述深度函数:
(DEF多深度adt类型)
(defmethod depth Empty[]0)
(定义方法深度叶[]1)
(定义方法深度节点[节点]
(+1(最大(深度(节点:左侧))(深度(节点:右侧)俬俬俬)
(defmethod深度:默认值[]0)
资料来源: