Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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
何谓';Clojure支持多种分类法';关于多态性?_Clojure - Fatal编程技术网

何谓';Clojure支持多种分类法';关于多态性?

何谓';Clojure支持多种分类法';关于多态性?,clojure,Clojure,我一直在这里阅读“Clojure理由”: http://clojure.org/rationale 在多态性一节中,内容如下: Clojure multimethods decouple polymorphism from OO and types Supports multiple taxonomies Dispatches via static, dynamic or external properties, metadata, etc 这里的“支持多种分类法”是什么意思?

我一直在这里阅读“Clojure理由”:

http://clojure.org/rationale
在多态性一节中,内容如下:

Clojure multimethods decouple polymorphism from OO and types

   Supports multiple taxonomies
   Dispatches via static, dynamic or external properties, metadata, etc

这里的“支持多种分类法”是什么意思?事实上,在这种情况下,什么是分类法?谢谢

Clojure和许多其他函数式语言一样,利用松散类型提供了简单的实现方法。这基本上意味着一个方法可以以一种不关心给定参数的值类型的方式构造

concat
方法为例。它接受任意数量的不同形式的参数,并将它们放入一个列表中,如下所示:

user=> (concat [:a :b] nil [1 [2 3] 4])
(:a :b 1 [2 3] 4)
因为不需要为参数声明类型,
concat
可以这样编写,即您可以提供任何类型的参数(向量、函数、关键字、字符串等),并且它将以类似的方式作用于这些参数

Clojure允许您通过使用元数据或其他属性来确定处理给定参数的适当方式,在可能具有完全不同结构(即分类法)的Java对象上支持此概念。请参见以下示例(摘自):

问候语
方法从映射中返回与返回正确对应值的
“English”
“French”
defmethod匹配的
“language”
值。希望您能看到这个概念如何潜在地应用于几乎任何类型的数据或对象结构。这种强大的多态性思想正是Clojure开发人员试图在原理页面中展示的

user> (defmulti shade :color)
nil
user> (defmethod shade :black [_] "darkest of darks")
#<MultiFn clojure.lang.MultiFn@22b90f93>
user> (defmethod shade :white [_] "all frequencies are reflected")
#<MultiFn clojure.lang.MultiFn@22b90f93>
user> (defmulti movement :legs)
#'user/movement
user> (defmethod movement 2 [_] "walks on hind legs")
#<MultiFn clojure.lang.MultiFn@13b58075>
user> (defmethod movement 4 [_] "proceeds on all fours")
#<MultiFn clojure.lang.MultiFn@13b58075>
user> ((juxt movement shade) {:name "cat" :legs 4 :color :black})
["proceeds on all fours" "darkest of darks"]
在这里,同一只猫是两个等级的成员——一个是驯化,另一个是遗传学,并且可以根据需要通过任何一个等级来解决它的方法

此外,即使设置asid multimethods,通过
派生
创建的关系也支持多重继承,这与jvm类继承人制度Clojure的基础不同:

user> (derive ::foo ::bar)
nil
user> (derive ::foo ::baz)
nil
user> (derive ::quux ::foo)
nil
user> (isa? ::quux ::foo)
true
user> (isa? ::quux ::bar)
true
user> (isa? ::quux ::baz)
true
user> (isa? ::bar ::baz)
false

例如,在Java中,您有一个类的层次结构,必须使用这些类和接口作为多态性的基础。使用Clojure的multimethods,您可以创建任意层次结构/分类系统(分类法)作为多态性的基础。”…完全不同的结构(即分类法)“-这句话让我感到困惑。你是说它们的结构就是它们的分类法?你的意思是说,例如,它们的分类可以是一种结构?坦率地说,这两种解读对我来说都很奇怪。分类法是一种分类的层次结构,我只是不能在考虑到该定义的情况下解析该语句。
user> (derive ::manx ::cat)
nil
user> (defmulti favorite-treat :species)
#'user/favorite-treat
user> (defmethod favorite-treat ::cat [_] "Tuna")
#<MultiFn clojure.lang.MultiFn@264d27e6>
user> (derive ::indoor ::domestic)
nil
user> (defmulti activity :tameness)
#'user/activity
user> (defmethod activity ::domestic [_] "window watching")
#<MultiFn clojure.lang.MultiFn@1654bf3f>
user> ((juxt favorite-treat activity) {:species ::manx :tameness ::indoor})
["Tuna" "window watching"]
user> (derive ::foo ::bar)
nil
user> (derive ::foo ::baz)
nil
user> (derive ::quux ::foo)
nil
user> (isa? ::quux ::foo)
true
user> (isa? ::quux ::bar)
true
user> (isa? ::quux ::baz)
true
user> (isa? ::bar ::baz)
false