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))))
但我预计这种比较向量的方法非常常见,因此有一个标准方法可以实现这一点。有吗?
最佳答案
如果两个事物实现了接口(interface)java.lang.Comparable
,则compare
函数会比较它们。 Clojure 中的 Vector 实现了此接口(interface),如 this 所示。链接,基本上它首先检查长度。没有核心函数可以完成您想要的操作,因此您必须推出自己的函数。
我想提的另一件事是,haskell 版本基本上是比较列表(而不是向量),计算列表长度效率不高,这在比较列表时避免长度是有意义的,因为向量长度计算是 O(1 ) 操作,因此首先检查长度是有意义的。
关于sorting - 是否有一种标准方法可以以 'conventional' 的方式比较 Clojure 向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15716894/