在所有参数的类别上,Clojure多方法调度



我正在尝试编写一个多方法,该多方法根据传递给它的所有参数的类型进行派遣,但是我正在努力弄清楚如何编写这样的distpatch fn。/p>

我的意思是,给定:

(defmulti foo (fn [& args] ...))
(defmethod foo String
  [& args]
  (println "All strings"))
(defmethod foo Long 
  [& args]
  (println "All longs"))
(defmethod foo Number
  [& args]
  (println "All numbers"))
(defmethod foo :default
  [& args]
  (println "Default"))

然后我们会得到:

(foo "foo" "bar" "baz") => "All strings"
(foo 10 20 30) => "All longs"
(foo 0.5 10 2/3) => "All numbers"
(foo "foo" 10 #{:a 1 :b 2}) => "Default"
(defmulti foo (fn [& args] (into #{} (map class args))))
(defmethod foo #{String}
  [& args]
  (println "All strings"))
(defmethod foo #{Long}
  [& args]
  (println "All longs"))
(defmethod foo #{Number}
  [& args]
  (println "All numbers"))
(defmethod foo :default
  [& args]
  (println "Default"))

导致:

(foo "foo" "bar" "baz") => "All strings"
(foo 10 20 30) => "All longs"
(foo 0.5 10 2/3) => "Default"
(foo "foo" 10 #{:a 1 :b 2}) => "Default"

所以数字示例不起作用。

这是调度员FN:

(defmulti foo (fn [& args]
                (let [m (distinct (map type args))]
                  (when (= 1 (count m))
                    (first m)))))

最新更新