每当在Haskell中我们需要一些变量数据类型时,我们会将ADT与模式匹配结合使用。 Clojure人们用这种用例做什么?
答案 0 :(得分:9)
嗯,实际上有一些为Clojure编写的模式匹配库。 Clojure的宏使这种事情成为可能。 Matchure是最近的一个。 ADTs in contrib甚至还有一些东西。
忽略这些东西,我们在核心Clojure中对Haskell的ADT最接近的是Clojure 1.2中的新记录和数据类型。但是,除非您需要使用记录或数据类型带来的好处,否则通常只需使用地图。 Clojure是一种动态语言,所以如果你使用记录等,你就不会得到静态类型检查。
Clojure具有“解构”,这让人联想到模式匹配,并且在惯用的Clojure中使用了很多。请参阅this和this。前者是你真正的答案。 ; P
答案 1 :(得分:4)
这取决于你想要做什么。但假设基于数据类型需要多态行为的常见情况,协议通常是一种很好的方法:
(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的可能值以及协议函数的多态行为。
答案 2 :(得分:1)
查看matchure库 - 它应该在近期包含在clojure-contrib中
答案 3 :(得分:0)
我非常喜欢yap作为模式匹配库。
同时拥有关键字和符号这一事实使得在模式匹配库之上实现变体非常容易。
答案 4 :(得分:0)
可以使用多种方法和宏。
下面可以找到一个示例。
那么它们在Clojure中的外观如何?
此ADT实现将使用的语法如下:
ingestion_time()
此语法非常类似于Haskell代码。我们还将看到,我们可以像上面这样定义深度功能:
hash()
来源: http://gizmo385.github.io/clojure/programming/2015/08/11/adts-in-clojure.html