如何在Clojure中编写monoid协议?

mis*_*tor 9 functional-programming clojure monoids

由于显而易见的原因,以下内容不起作用.

(defprotocol Monoid
  (mappend [a b])
  (mzero []))
Run Code Online (Sandbox Code Playgroud)

mzero零参数,协议中不允许(或没有意义)零参数方法.在Haskell或Scala中,调度是基于类型而不是基于值的,这不是问题.

Monoid在Clojure中概念化和编写协议的正确方法是什么?

and*_*oke 5

在查看源代码时,在新的reducers库中实现它的方式不是作为一个procotol而是一个重载函数.一个没有args的呼叫是mzero; 两个args电话是mappend.

更准确地说,monoid接受两个参数 - op并且ctor返回一个函数,当没有参数调用时,它会进行求值ctor,当用两个调用时,委托给op.

这与折叠中的零处理方式一致,例如 - reduce(折叠)将评估折叠的函数,如果需要,不用args查找零.

我觉得有点羞于表现出如此令人兴奋的东西,但我不知道你怎么能在clojure中做得更好.感谢评论中的解释/教育.