来自功能的奇怪结果 - 发生了什么?

时间:2011-11-17 22:42:01

标签: join clojure relational-algebra

我正在使用clojure.set中的the join function。具有两个参数的join应该进行自然连接。

加载它:

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}{},并且排了一排。我错过了什么?

1 个答案:

答案 0 :(得分:3)

根据您的观察方式,它可能是join中的错误,也可能是调用代码中将{:a 2 :b 1}{}视为同一关系成员的错误;我倾向于后者。

具体地说,为什么会发生这种情况是使用每个关系的第一个映射计算两个关系的键的一次。这也是为什么如果在第二关系中交换两个地图的位置,你会得到不同的结果。