如何在Clojure中编写monoid协议?

时间:2012-05-26 16:05:24

标签: clojure functional-programming monoids

由于显而易见的原因,以下方法无效。

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

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

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

1 个答案:

答案 0 :(得分:5)

查看sourcenew reducers library中实现它的方式不是作为一个procotol而是一个重载函数。一个没有args的呼叫是mzero;两个args电话是mappend。

更确切地说,monoid接受两个参数 - opctor并返回一个函数,当使用无参数调用时,它会评估ctor,并在调用时使用两个,代表op

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

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