由于显而易见的原因,以下内容不起作用。
(defprotocol Monoid
(mappend [a b])
(mzero []))
mzero
有零参数,并且协议中不允许(或没有意义)零参数方法。在 Haskell 或 Scala 中,调度是基于类型而不是基于值的,这不是问题。
概念化和写作的正确方法是什么Monoid
Clojure 中的协议?
看着source https://github.com/clojure/clojure/blob/89e5dce0fdfec4bc09fa956512af08d8b14004f6/src/clj/clojure/core/reducers.clj#L279,这是在新的减速器库 http://clojure.com/blog/2012/05/08/reducers-a-library-and-model-for-collection-processing.html不是一个协议,而是一个重载函数。无参数调用是 mzero;两个args调用是mappend。
更准确地说,monoid
有两个参数 -op
and ctor
并返回一个函数,当不带参数调用时,该函数的计算结果为ctor
,当有两个人一起调用时,代表op
.
这与折叠中处理零的方式一致,例如 -reduce
如有必要, (fold) 将评估不带参数的折叠函数以找到零。
我觉得有点羞于展示如此平淡无奇的东西,但我不知道如何在 clojure 中做得更好。感谢评论中的解释/教育。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)