Clojure对所有参数类的多方法分派
我试图编写一个multi方法,它根据传递给它的所有参数的类型进行分派,但我正在努力找出如何编写这样一个distpatch fn 我的意思是,考虑到:Clojure对所有参数类的多方法分派,clojure,Clojure,我试图编写一个multi方法,它根据传递给它的所有参数的类型进行分派,但我正在努力找出如何编写这样一个distpatch fn 我的意思是,考虑到: (defmulti foo (fn [& args] ...)) (defmethod foo String [& args] (println "All strings")) (defmethod foo Long [& args] (println "All longs")) (defmethod
(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"
结果:
(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"
因此,数字示例不起作用
结果:
(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"
因此,数字示例不起作用。以下是dispatcher fn:
(defmulti foo (fn [& args]
(let [m (distinct (map type args))]
(when (= 1 (count m))
(first m)))))
这是调度员fn:
(defmulti foo (fn [& args]
(let [m (distinct (map type args))]
(when (= 1 (count m))
(first m)))))
需要在
Number
上发送使事情复杂化,因为现在您正在寻找常见的超级类型。确实需要吗?需要在Number
上调度会使事情变得复杂,因为现在您正在寻找常见的超级类型。真的需要吗?