Странный результат от функции - что происходит? - PullRequest
3 голосов
/ 18 ноября 2011

Я использую функцию соединения из clojure.set.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 Ответ

3 голосов
/ 18 ноября 2011

В зависимости от того, как вы на это смотрите, это либо ошибка в join, либо ошибка в вызывающем коде, которая обрабатывает {:a 2 :b 1} и {} как элементы одного и того же отношения; Я склоняюсь к последнему.

Конкретно, почему это происходит, заключается в том, что пересечение ключей двух отношений рассчитывается один раз с использованием первой карты каждого отношения. Вот почему вы получите разные результаты, если поменять местами две карты во втором отношении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...