如何使用类型暗示创建具有可变参数数的Clojure多方法?

如何使用类型暗示创建具有可变参数数的Clojure多方法?,clojure,multimethod,Clojure,Multimethod,我试图使用类型暗示来区分两个单参数方法 例如,AddVertex正在包装一个Java方法,该方法可以接受可变数量的参数,所以这里我尝试让AddVertex接受零、一或两个参数 (defmulti add-vertex (fn [& args] (map class args))) (defmethod add-vertex [] (add-vertex nil nil)) (defmethod add-vertex Integer [id] (add-vertex id nil)) (d

我试图使用类型暗示来区分两个单参数方法

例如,AddVertex正在包装一个Java方法,该方法可以接受可变数量的参数,所以这里我尝试让AddVertex接受零、一或两个参数

(defmulti add-vertex (fn [& args] (map class args)))
(defmethod add-vertex [] (add-vertex nil nil))
(defmethod add-vertex Integer [id] (add-vertex id nil))
(defmethod add-vertex Map [props] (add-vertex nil props))
(defmethod add-vertex [Integer Map] [id props]
  ((let [vertex (. *g* addVertex id)]
    (when props
      (apply set-props vertex (interleave (map name (keys props)) (vals props))))
    vertex)))

请注意,有两个singe arg func——每个函数采用不同的类型(id是Java整数,props是Java映射)。我是Clojure的新手,所以我怀疑我这样做完全是错误的。

您没有使用类型暗示,而是编写类文本作为计算分派函数的值。你的问题是你不能把所有的类型都包含在一个向量中,即使只有一个


我强烈建议您使用多种方法。

以下是您尝试执行的代码:

(defmulti添加顶点(fn[&args](贴图类args)))
(defmethod add vertex[][](add vertex nil nil))
;; 您也可以在这里使用java.lang.Integer,但默认情况下数字是长的
(defmethod add vertex[java.lang.Long][id]
(添加顶点id nil))
;; 我假设您使用的是clojure映射,即{:1:2}
(defmethod添加顶点[clojure.lang.PersistentArrayMap][props]
(添加顶点零道具))
(defmethod add vertex[java.lang.Long clojure.lang.PersistentArrayMap][id props]…)
但正如你所看到的,这些类变得相当混乱

另一种解决方案可能是这样做:

(defn调度fn
([]:空)
([a](续)
(数字?a):数字
(地图?a):地图
:其他:错误)
([a b](如果(和(a号)(地图b))
:号码和地图
:错误)
([a b&args]:错误))
(defmulti add顶点分派fn)
(defmethod add vertex:empty[](add vertex nil nil))
(添加顶点的方法:编号[id](添加顶点id为零))
(添加顶点:贴图[道具](添加顶点零道具))
(添加顶点的方法:编号和贴图[id props]…)
(defmethod添加顶点:错误[&args]…)