Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Clojure';s替代哈斯克尔';s ADT和模式匹配?_Haskell_Clojure_Functional Programming_Pattern Matching_Abstract Data Type - Fatal编程技术网

Haskell Clojure';s替代哈斯克尔';s ADT和模式匹配?

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是一种动态语言,所以如果使用记录之类的东西,就不会进行静

在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)
资料来源: