有没有一种标准的方法来比较“传统”方式的Clojure向量

时间:2013-03-30 09:17:36

标签: sorting vector clojure

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))))

但我希望这种比较矢量的方式非常普遍,以至于有一种标准的方法来实现这一点。有吗?

2 个答案:

答案 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 )操作,因此首先检查长度是有意义的。