The following does not work, for obvious reasons.
(defprotocol Monoid
(mappend [a b])
(mzero []))
mzero has zero arguments, and zero argument methods are not allowed (or do not make sense) in protocols. In Haskell or Scala, where the dispatch is type-based rather than value-based, this is not a problem.
What would be the correct way to conceptualize and write Monoid protocol in Clojure?
looking at the source, the way that this is implemented in the new reducers library is not as a procotol but an overloaded function. a no-args call is mzero; two args call is mappend.
more exactly,
monoidtakes two arguments -opandctorand returns a function which, when called with no arguments, evaluatesctor, and when called with two, delegates toop.this is consistent with how zero is handled in a fold, for example -
reduce(fold) will evaluate the function being folded with no args to find the zero, if necessary.i feel a bit ashamed to show something so unexciting, but i don't see how you can do better within clojure. thanks for the explanations/education in the comments.