4

Clojure ベクトルには、それらを比較すると、他のどのプロパティよりも先にベクトルの長さが考慮されるという珍しい特性があります。例えばHaskellでは

Prelude> [1, 3] > [1, 2, 3]
True

とルビー

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

しかし、ベクトルを比較するこの方法は非常に一般的であるため、これを達成するための標準的な方法があると思います。ある?

4

2 に答える 2

3

compareインターフェイスが実装されている場合、関数は 2 つのものを比較しますjava.lang.Comparable。Clojure の Vector は、このリンクに示されているようにこのインターフェイスを実装します。基本的には、最初に長さをチェックします。あなたが望むことをするコア機能はないので、独自の機能をロールバックする必要があります。

私が言及したい他のことは、haskellバージョンは基本的にリスト(ベクトルではなく)を比較しており、ベクトルの長さの計算がO(1)操作であるため、リストを比較しながら長さを避けるために理にかなっているリストの長さを計算することは効率的ではないということです。したがって、最初に長さを確認することは理にかなっています。

于 2013-03-30T12:38:49.450 に答える
3

このようなもの?

(first (filter (complement zero?) (map compare [1 3] [1 2 3])))
于 2013-03-30T11:53:42.063 に答える