【问题标题】:How to code a variadic defmulti/defmethod in clojure如何在 clojure 中编写可变参数 defmulti/defmethod
【发布时间】:2014-09-30 21:16:51
【问题描述】:

我有一个 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))

我想用超过 2 个参数调用“foo”。 我知道如何使用函数来做到这一点,我想我可以使用一些包装函数将 args 拆分成对,然后组合结果(或者只使用“reduce”),但这似乎是错误的。

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

【问题讨论】:

标签: clojure polymorphism variadic


【解决方案1】:

defmulti dispatch 函数和defmethod body 可变参数签名并没有错,这是完全惯用的:

(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"

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
相关资源
最近更新 更多