Clojure 优先级映射

4

我有如下内容:

(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]]}

what I expect is,

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

我是否忽略了一些明显的东西,为什么items值被修改了?还是这是一个bug?

2个回答

1

我通过不使用比较器并根据条件返回-1 0 1来获得我想要的结果。

(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

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是否是预期行为,您需要向作者询问。我认为这是合理的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接