2012-05-26 58 views
9

由于显而易见的原因,以下方法无效。如何在Clojure中编写monoid协议?

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

mzero具有零个参数,无参数的方法是不允许的(或没有意义)的协议。在Haskell或Scala中,派发是基于类型而不是基于值的,这不是问题。

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

+0

为什么你需要它成为协议而不是模块?如果您期待不同的实现,那么haskell将如何推断特定用例需要哪种实现? (我认为这是一个很好的问题,我只是试图追究相关问题)。 –

+1

@andrewcooke Haskell根据使用地点的静态类型推断。被调用的方法静态解析。 –

+0

@andrewcooke,模块在你的陈述中的含义是什么? – missingfaktor

回答

5

看着source,这在new reducers library中实现的方式不是一个协议,而是一个重载函数。无参数调用是mzero;两个参数调用是mappend。

更确切地说,monoid有两个参数 - opctor和返回功能,当不带参数调用,评估ctor,当有两个,代表叫op

这与在折叠中如何处理零一致,例如 - reduce(折叠)将评估折叠的函数,如果有必要,将不带参数地找到零。

我觉得有点羞愧,显示出一些令人无法理解的东西,但我不知道如何在clojure中做得更好。感谢评论中的解释/教育。

+0

好的,那回答了这个问题。谢谢! – missingfaktor