Clojure priority-map - PullRequest
       1

Clojure priority-map

4 голосов
/ 30 сентября 2011

У меня есть следующее,

(let [t (priority-map-by (comparator (fn [[f1 _] [f2 _]]
                                       (< f1 f2)))
                         :b [8 [2 1]])]

  (assoc t :c [8 [2 3]]))

по какой-то причине связанный элемент: c после добавления на карту изменяется,

{:c [8 [2 1]], :b [8 [2 1]]}

что я ожидаю,

{:c [8 [2 3]], :b [8 [2 1]]}

Я упускаю что-то очевидное, почему изменяется значение предметов? или это ошибка?

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

Я получил то, что хотел, не используя компаратор и возвращая -1 0 1 в зависимости от cond,

(let [t (priority-map-by (fn [x y]
                             (if (= x y)
                               0
                               (let [[f1 _] x
                                     [f2 _] y]
                                 (if (< f1 f2) -1 1))))

                         :b [8 [2 1]])]

  (assoc t :c [8 [2 3]]))

, который дает мне то, что я хочу,

{:b [8 [2 1]], :c [8 [2 3]]}
0 голосов
/ 30 сентября 2011

Глядя на реализацию для priority-map-by, похоже, что она основана на sorted-map-by, в котором говорится, что сравниваемые клавиши одинаковы. Например:

(sorted-map-by (fn [[a] [b]] (< a b)) [1 2] :foo [1 3] :bar)
=> {[1 2] :bar}

Это также верно для sorted-set-by:

(sorted-set-by (fn [[a] [b]] (< a b)) [1 2] [1 3] [3 4])
=> #{[1 2] [3 4]}

Является ли это предполагаемым поведением для priority-map-by, вам нужно спросить автора. Я думаю, что это разумно.

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