如何在clojure中编写可变参数defmulti / defmethod

时间:2014-09-30 21:16:51

标签: clojure polymorphism variadic

我有一个defmulti / defmethod组,它接受一对像这样的参数......

(defmulti foo "some explanation" (fn [arg1 arg2] (mapv class [arg1 arg2])))
(defmethod foo [N P] (->L 1 2 3))
(defmethod foo [L P] (->N 5))
(defmethod foo [P N] (->L 6 7 8))
 ...

以您期望的方式调用它们。

(foo (->N 9) (->P 9))

我想要的是打电话给foo'超过2个参数。 我知道如何使用函数执行此操作,我想我可以使用一些包装函数将args拆分成对,然后组合结果(或者只是使用' reduce')但这似乎是错误的。

我的问题是...... 在clojure中定义可变参数多功能的惯用方法是什么?

1 个答案:

答案 0 :(得分:5)

赋予defmulti派遣函数和defmethod机构可变参数签名并没有错,这是完全惯用的:

(defmulti bar (fn [x & y] (class x)))
(defmethod bar String [x & y] (str "string: " (count y)))
(defmethod bar Number [x & y] (str "number: " (count y)))

(bar "x" 1 2 3) ;=> "string: 3"
(bar 1 2 3) ;=> "number: 2"