由于显而易见的原因,以下方法无效。
(defprotocol Monoid
(mappend [a b])
(mzero []))
mzero
的参数为零,协议中不允许使用零参数方法(或没有意义)。在Haskell或Scala中,调度是基于类型而不是基于值的,这不是问题。
在Clojure中概念化和编写Monoid
协议的正确方法是什么?
答案 0 :(得分:5)
查看source,new reducers library中实现它的方式不是作为一个procotol而是一个重载函数。一个没有args的呼叫是mzero;两个args电话是mappend。
更确切地说,monoid
接受两个参数 - op
和ctor
并返回一个函数,当使用无参数调用时,它会评估ctor
,并在调用时使用两个,代表op
。
这与折叠中的零处理方式一致,例如 - reduce
(fold)将评估折叠的函数,如果需要,不用args查找零。
我觉得有点羞于表现出如此令人兴奋的东西,但我不知道你怎么能在clojure中做得更好。感谢评论中的解释/教育。