プライオリティ マップが reduce (AbstractMethodError if you try) を実装していないことに気付きました。それを拡張するにはどうすればよいですか?
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 コレクション インターフェイスも実装されていることを前提としていますが、実際にはこれらのインターフェイスを拡張していません。そのため、それらのいくつかを実装するのを忘れて、それらが実装されていることを前提とするコードに到達するまで、問題なく動作する可能性があります。
この場合、見落とされたインターフェイス (または少なくともその 1 つ) は Iterable です。reduce は、それについて何も知らなくても、任意の Iterable で機能します。プライオリティ マップを Iterable に実装するためのパッチを適用する方法について説明します。
于 2012-09-04T18:18:38.970 に答える