2

我注意到优先级映射没有实现reduce(如果您尝试,则为AbstractMethodError) - 我该如何扩展它以便它可以?

4

2 回答 2

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)
于 2012-09-04T09:40:08.243 回答
2

这是由 clojure.core 对集合实现做出的一些隐含假设引起的,据我所知,这些假设在任何地方都没有编纂。具体来说,它假设所有的 java 集合接口也都实现了,但实际上并没有扩展这些接口。因此,可能会忘记实现其中的一些,然后让事情正常工作,直到你得到一些假设它们已实现的代码。

在这种情况下,遗漏的接口(或至少其中一个)是 Iterable:reduce 可以在任何 Iterable 上工作,而无需了解更多信息。我将看到如何应用补丁以使优先级映射实现 Iterable。

于 2012-09-04T18:18:38.970 回答