3

の結合機能を使用していclojure.setます。 joinwith two parameters は、自然な結合を行うことになっています。

それをロードします:

user=> (use 'clojure.set)
nil

これは理にかなっています-結合のどちらかの側に0行がある場合、結果は次のようになります:

user=> (join [{:a 1 :b 2}] [])
#{} 

これも理にかなっています-同じ名前の列(それらのすべて0 :))は同じ値を持ちます:

user=> (join [{:a 1 :b 2}] [{}])
#{{:a 1, :b 2}}

ここで同じこと:

user=> (join [{:a 1 :b 2}] [{:c 3}])        
#{{:c 3, :a 1, :b 2}}

しかし、ここで私は迷子になります:

user=> (join [{:a 1 :b 2}] [{:a 2 :b 1} {}])
#{}

先程入会{:a 1 :b 2}して列に並びました。{}私は何が欠けていますか?

4

1 に答える 1

3

見方によっては、 のバグか、とを同じリレーションのメンバーとしてjoin扱う呼び出しコードのバグのいずれかです。私は後者に傾いています。{:a 2 :b 1}{}

具体的には、これが発生する理由は、2 つのリレーションのキーの交差が、各リレーションの最初のマップを使用して 1 回計算されるためです。これが、2 番目のリレーションで 2 つのマップの位置を入れ替えると、異なる結果が得られる理由でもあります。

于 2011-11-18T00:13:19.043 に答える