Clojure向量具有不常见的属性,当您比较它们时,向量的长度在任何其他属性之前被考虑。在例如Haskell的
Prelude> [1, 3] > [1, 2, 3]
True
和Ruby
1.9.3p392 :003 > [1, 3] <=> [1, 2, 3]
=> 1
但是在Clojure中:
user=> (compare [1, 3] [1, 2, 3])
-1
现在您可以自己实施“传统”比较:
(defn vector-compare [[value1 & rest1] [value2 & rest2]]
(let [result (compare value1 value2)]
(cond
(not (= result 0)) result
(nil? value1) 0 ; value2 will be nil as well
:else (recur rest1 rest2))))
但我希望这种比较矢量的方式非常普遍,以至于有一种标准的方法来实现这一点。有吗?
答案 0 :(得分:3)
这样的东西?
(first (filter (complement zero?) (map compare [1 3] [1 2 3])))
答案 1 :(得分:3)
如果compare
函数实现了接口java.lang.Comparable
,则它会比较两件事。 Clojure中的Vector实现了这个接口,如this链接所示,基本上它首先检查长度。没有核心功能可以满足您的需求,因此您必须自己动手。
我想提一下的另一件事是,haskell版本基本上是比较列表(不是矢量),并且计算列表长度是有效的,这有助于避免长度,同时比较列表,其中矢量长度计算为O(1 )操作,因此首先检查长度是有意义的。