contains?
私は clojure の初心者であり、さまざまなデータ構造へのフォームの使用に少し混乱しています。
ベクトル、セット、またはマップに適用contains
した結果は、私が期待したとおりです。コレクションにキー (またはインデックス) が存在するかどうかをテストします。しかし、次のようなリストになると
(def li '(1 2 3)) ; define a list
(contains? li 1) ; returns false !!??
contains?
そのドキュメントには、実装が定数またはログ時間で動作すると記載されているため、リストがどのように機能するかを理解するのはそれほど簡単ではないことはわかっています。したがって、ここでは、1 がリストまたはそのインデックス範囲内にあるかどうかをログ時間未満でテストすることはあまり意味がありません。assoc
しかし、その場合、リストを適用するときのように例外が発生しないのはなぜですか。assoc
哲学が同じである場合、assoc
要素の十分に高速なランダムアクセスをサポートしていないため、リストに適用しないでください。
clojure の多くのフォームは結果として一般的なコレクションを返すので不便に感じます(vals a-map)
.同じことのさまざまな言い方。
(def a-map {:one 1 :two 2})
(contains? (vals a-map) 1) ; returns false!!
(contains? (set (vals a-map)) 1); returns true!!
長い説明の後、私の質問は、この設計の背後にある合理的な理由は何ですか? 要素が clojure のマップの値セットに含まれているかどうかをテストしたい場合、それをネイティブにどのように言えばよいでしょうか。つまり、もっと重要なことに、実際にばかげたバグを作らないようにするにはどうすればよいのでしょうか? ありがとう!