作为一个例子,我们希望我们可以在 OrderedCollection [Monoid] 类型的实体上定义 sum ,其中 Monoid 是一个特征/接口使用零关联操作。然后我们不需要剪切和粘贴 sum 的代码来使用它。但类型可以是多种方式的幺半群:例如带有+和0或带*和1的正整数。我无法找到一个很好的方法来处理它。
答案 0 :(得分:1)
Haskell有一个很好的技巧来处理使用newtype
语言特征的许多幺半群的情况:
http://blog.sigfpe.com/2009/01/haskell-monoids-and-their-uses.html(读自“相同类型可以以不同方式产生幺半群。”)
http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Monoid.html#3(关于数字库加法和乘法幺半群的官方文档)。
答案 1 :(得分:0)
当然,您需要明确指出您希望使用哪种操作?我没有看到任何理智的方法来避免这种情况。
在Clojure中我只使用更高阶的函数:
(defn sum-with [op]
(fn [coll]
(reduce op coll)))
然后你可以这样做:
(def sum1 (sum-with +))
(sum1 [1 2 3 4])
=> 10
(def sum2 (sum-with *))
(sum2 [1 2 3 4])
=> 24