9

由于显而易见的原因,以下方法不起作用。

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

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

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

4

1 回答 1

5

查看源代码,在新的 reducers 库中实现它的方式不是作为协议,而是作为重载函数。无参数调用是 mzero;两个 args 调用是 mappend。

更准确地说,monoid它接受两个参数 -opctor返回一个函数,该函数在不带参数调用时ctor计算op.

这与在折叠中处理零的方式一致,例如 - reduce(fold) 将评估正在折叠的函数,没有 args 以在必要时找到零。

我觉得展示一些如此平淡无奇的东西有点羞耻,但我看不出你如何在 clojure 中做得更好。感谢评论中的解释/教育。

于 2012-05-26T19:02:46.723 回答