如何扩展优先级图可以简化

时间:2012-09-04 05:15:48

标签: clojure extend reduce

我注意到priority map没有实现reduce(如果你尝试的话,是AbstractMethodError) - 我该怎么做才能扩展呢?

2 个答案:

答案 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。