2011-09-30 81 views
4

我有以下,Clojure的優先級映射

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

我錯過了一些明顯的東西爲什麼項目值被修改?或者這是一個錯誤?

回答

1

我得到了我想要通過不使用比較並根據COND返回-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

查看implementation對於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,你必須要問筆者。我認爲這是合理的。