2017-12-04 8 views
3

clojureベクトルが連想インターフェースを実装していることに驚きました。ベクターがアソシエーティブを実装するのはなぜですか?

私は、このインターフェイスがキーによる最適化インデックスを提供すると仮定します。この前提に従えば、インタフェースは地図データ構造には適しているように見えますが、私の考えではキー値のヒューリスティックに従わないベクトルでは奇妙です。

私の精神モデルAssociativeまたはvectorの実装は間違っていますか?このデザインの選択は、どのような目的に役立ちますか?

答えて

8

最初は直感的ではないように見えるかもしれませんが、ベクトルはそれらのインデックスによってキーイングされ、すべての標準関連機能を利用できます。この設計上の選択がなければ

(def v [[1 2 3] 
     [4 5 6] 
     [7 8 9]]) 

(assoc-in v [2 1] 0) 
[[1 2 3] 
[4 5 6] 
[7 0 9]] 

、機能の全体の別個のセットをする必要があります:あなたは、2Dベクトルを持っている場合、

(def v [1 2 3]) 

(assoc v 1 4) 
[1 4 3] 

(update v 1 inc) 
[1 3 3] 

(get v 1) 
2 ; Same as (v 1) 

をまたは:これは、それは非常に簡単にそれらに簡単な操作を行うことになりベクター用に作成され、特に使用されます。標準化されたインターフェースを持つことで、彼らが取り組んでいる構造を特に気にしない関数を書くことができます。

このように考えてみましょう:ベクトルの要素を「置き換える」関数を作成したいとします。その署名は、既存のassoc関数とは異なるものになりますか?特にベクトルを期待する以外に?

4

Clojureベクトルは、インデックスに値を関連付けます。これは、次のようなことができることを意味します。

(assoc [0 1] 0 2) 

(reduce-kv (fn [m idx v] 
      (assoc m idx v)) {} [0 1 2]) 

両方とも効率的です。

関連する問題