9

明らかな理由により、以下は機能しません。

(defprotocol Monoid
  (mappend [a b])
  (mzero []))

mzero引数がゼロであり、引数がゼロのメソッドはプロトコルでは許可されていません (または意味がありません)。ディスパッチが値ベースではなく型ベースである Haskell または Scala では、これは問題になりません。

MonoidClojure でプロトコルを概念化して記述する正しい方法は何でしょうか?

4

1 に答える 1

5

sourceを見ると、これが新しい reducers ライブラリに実装されている方法は、プロトコルとしてではなく、オーバーロードされた関数です。引数なしの呼び出しは mzero です。2 つの引数の呼び出しは mappend です。

より正確には、 monoid2 つの引数を取ります - opand and は、引数なしで呼び出された場合は を評価し、2 つ指定された場合は に委譲するctor関数を返します。ctorop

これは、折り畳みでゼロがどのように処理されるかと一致していますreduce

それほど刺激的でないことを示すのは少し恥ずかしいですが、どうすれば clojure 内でうまくやれるかわかりません。コメントでの説明/教育に感謝します。

于 2012-05-26T19:02:46.723 に答える