什么语言支持一次写作?

时间:2011-10-21 01:50:00

标签: language-design

作为一个例子,我们希望我们可以在 OrderedCollection [Monoid] 类型的实体上定义 sum ,其中 Monoid 是一个特征/接口使用零关联操作。然后我们不需要剪切和粘贴 sum 的代码来使用它。但类型可以是多种方式的幺半群:例如带有+和0或带*和1的正整数。我无法找到一个很好的方法来处理它。

2 个答案:

答案 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