由于显而易见的原因,以下方法不起作用。
(defprotocol Monoid
(mappend [a b])
(mzero []))
mzero
具有零参数,并且协议中不允许(或没有意义)零参数方法。在 Haskell 或 Scala 中,调度是基于类型而不是基于值的,这不是问题。
Monoid
在 Clojure中概念化和编写协议的正确方法是什么?
由于显而易见的原因,以下方法不起作用。
(defprotocol Monoid
(mappend [a b])
(mzero []))
mzero
具有零参数,并且协议中不允许(或没有意义)零参数方法。在 Haskell 或 Scala 中,调度是基于类型而不是基于值的,这不是问题。
Monoid
在 Clojure中概念化和编写协议的正确方法是什么?
查看源代码,在新的 reducers 库中实现它的方式不是作为协议,而是作为重载函数。无参数调用是 mzero;两个 args 调用是 mappend。
更准确地说,monoid
它接受两个参数 -op
并ctor
返回一个函数,该函数在不带参数调用时ctor
计算op
.
这与在折叠中处理零的方式一致,例如 - reduce
(fold) 将评估正在折叠的函数,没有 args 以在必要时找到零。
我觉得展示一些如此平淡无奇的东西有点羞耻,但我看不出你如何在 clojure 中做得更好。感谢评论中的解释/教育。