2013-03-30 35 views
4

Clojure向量具有不尋常的屬性,當你比較它們時,向量的長度被認爲是在任何其他屬性之前。在例如哈斯克爾有沒有一種標準的方法來比較Clojure向量的'傳統'方式

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

,但我希望這比較向量的方式非常簡單星期一,有一個標準的方式來實現這一點。在那兒?

回答

3

compare功能,如果他們實現接口java.lang.Comparable比較兩件事情。 Clojure中的矢量在this鏈接上顯示,實現此界面,基本上它首先檢查長度。沒有核心功能可以完成你想要的功能,所以你將不得不推出自己的功能。

其他的事情我想提到的是,haskell版本基本上是比較列表(而不是向量),並且計算列表長度是非常有效的,它可以避免長度,而比較列表,其中向量長度計算爲O 1)操作,因此首先檢查長度是有意義的。

3

是這樣的嗎?

(first (filter (complement zero?) (map compare [1 3] [1 2 3]))) 
+0

不幸的是,它不會返回不相等大小的向量的預期結果,例如[1 2]和[1 2 3]。在其他語言中(或者至少:Haskell和Ruby),當它們具有相同的前綴時,最長的向量將被視爲更大。較短的版本很好,但我主要想知道在覈心或標準庫中是否存在版本。 – Confusion

+0

授予,但也許在編寫自己的函數時,您可以利用我使用的一些核心功能。 – noahlz

相關問題