我注意到priority map没有实现reduce(如果你尝试的话,是AbstractMethodError) - 我该怎么做才能扩展呢?
答案 0 :(得分:3)
这对我有用:
(ns reducing
(:use clojure.data.priority-map)
(:import (clojure.data.priority_map PersistentPriorityMap)))
(extend-type PersistentPriorityMap
clojure.core.protocols/CollReduce
(coll-reduce
([this f] (reduce f (seq this)))
([this f val] (reduce f (seq this) val))))
(def p (priority-map :a 2 :b 1 :c 3 :d 5 :e 4 :f 3))
(reduce conj [] p)
答案 1 :(得分:2)
这是由clojure.core对集合的实现做出的一些隐含假设引起的,据我所知,这些假设在任何地方都没有编纂。具体来说,它假定所有java集合接口也已实现,但实际上并未扩展这些接口。因此,有可能忘记实现其中的一些,然后让事情正常工作,直到你得到一些假设它们已经实现的代码。
在这种情况下,错过的接口(或至少其中一个接口)是Iterable:reduce可以在任何Iterable上工作而不需要了解更多信息。我将看到应用补丁以使优先级映射实现Iterable。