我注意到优先级映射没有实现reduce(如果您尝试,则为AbstractMethodError) - 我该如何扩展它以便它可以?
问问题
161 次
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 回答