私は2つのプロトコルがあるとします。どのようにClojureプロトコルを別のプロトコルに拡張できますか?
(defprotocol A
(f [this]))
(defprotocol B
(g [x y]))
をそして、私は、プロトコルAをサポートするすべてのインスタンスに、プロトコルBを拡張したい:
(extend-protocol A
String
(f [this] (.length this)))
(extend-protocol B
user.A
(g [x y] (* (f x) (f y))))
主な動機は、すべてに別々にBを拡張することを避けるためでありますAが拡張される可能性のあるクラス、または他の人がAを拡張する可能性のある未知の将来のクラスにまで拡張することができます(例えば、Aが公開APIの一部であった場合など)。
しかし、これは動作しません - あなたは、次のような何かを得る:
(g "abc" "abcd")
=> #<IllegalArgumentException java.lang.IllegalArgumentException:
No implementation of method: :g of protocol: #'user/B found for
class: java.lang.String>
がすべてで、このことは可能ですか?そうでない場合は、同じ目標を達成するための賢明な回避策がありますか?
ありがとう。私はこれが私の場合の最良のアプローチだと思っています - シーケンスライブラリとの類推はここでもうまくいきます! – mikera