2

プライオリティ マップが reduce (AbstractMethodError if you try) を実装していないことに気付きました。それを拡張するにはどうすればよいですか?

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 コレクション インターフェイスも実装されていることを前提としていますが、実際にはこれらのインターフェイスを拡張していません。そのため、それらのいくつかを実装するのを忘れて、それらが実装されていることを前提とするコードに到達するまで、問題なく動作する可能性があります。

この場合、見落とされたインターフェイス (または少なくともその 1 つ) は Iterable です。reduce は、それについて何も知らなくても、任意の Iterable で機能します。プライオリティ マップを Iterable に実装するためのパッチを適用する方法について説明します。

于 2012-09-04T18:18:38.970 に答える