明らかな理由により、以下は機能しません。
(defprotocol Monoid
(mappend [a b])
(mzero []))
mzero
引数がゼロであり、引数がゼロのメソッドはプロトコルでは許可されていません (または意味がありません)。ディスパッチが値ベースではなく型ベースである Haskell または Scala では、これは問題になりません。
Monoid
Clojure でプロトコルを概念化して記述する正しい方法は何でしょうか?
明らかな理由により、以下は機能しません。
(defprotocol Monoid
(mappend [a b])
(mzero []))
mzero
引数がゼロであり、引数がゼロのメソッドはプロトコルでは許可されていません (または意味がありません)。ディスパッチが値ベースではなく型ベースである Haskell または Scala では、これは問題になりません。
Monoid
Clojure でプロトコルを概念化して記述する正しい方法は何でしょうか?
sourceを見ると、これが新しい reducers ライブラリに実装されている方法は、プロトコルとしてではなく、オーバーロードされた関数です。引数なしの呼び出しは mzero です。2 つの引数の呼び出しは mappend です。
より正確には、 monoid
2 つの引数を取ります - op
and and は、引数なしで呼び出された場合は を評価し、2 つ指定された場合は に委譲するctor
関数を返します。ctor
op
これは、折り畳みでゼロがどのように処理されるかと一致していますreduce
。
それほど刺激的でないことを示すのは少し恥ずかしいですが、どうすれば clojure 内でうまくやれるかわかりません。コメントでの説明/教育に感謝します。