Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure对所有参数类的多方法分派_Clojure - Fatal编程技术网

Clojure对所有参数类的多方法分派

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

我试图编写一个multi方法,它根据传递给它的所有参数的类型进行分派,但我正在努力找出如何编写这样一个distpatch fn

我的意思是,考虑到:

(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
上调度会使事情变得复杂,因为现在您正在寻找常见的超级类型。真的需要吗?