首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用类型提示来创建具有可变数量的参数的Clojure multimethod?

如何使用类型提示来创建具有可变数量的参数的Clojure multimethod?
EN

Stack Overflow用户
提问于 2012-04-17 15:49:49
回答 2查看 815关注 0票数 0

我尝试使用类型提示来区分两个单参数方法。

例如,add-vertex包装了一个Java方法,该方法可以接受可变数量的参数,所以我在这里尝试让add-vertex接受0个、1个或2个参数...

代码语言:javascript
复制
(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)))

请注意,有两个单参数函数--每个函数采用不同的类型(id是Java Integer,props是Java Map)。我刚接触Clojure,所以我怀疑我这样做是完全错误的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-20 00:08:36

以下是您要执行的操作的代码:

代码语言:javascript
复制
(defmulti add-vertex (fn [& args] (map class args)))
(defmethod add-vertex [] [] (add-vertex nil nil))

;; You could also use java.lang.Integer here, but numbers are Longs by default
(defmethod add-vertex [java.lang.Long] [id] 
                                       (add-vertex id nil))

;; I assume you are using a clojure map ie {:1 2}
(defmethod add-vertex [clojure.lang.PersistentArrayMap] [props] 
                                                        (add-vertex nil props))

(defmethod add-vertex [java.lang.Long clojure.lang.PersistentArrayMap] [id props] ...)

但正如您所看到的,这会使类变得相当混乱。

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

代码语言:javascript
复制
(defn dispatch-fn
  ([] :empty)
  ([a] (cond
         (number? a) :number
         (map? a)    :map
         :else       :error))
  ([a b] (if (and (number? a) (map? b))
             :number-and-map
             :error))
  ([a b & args] :error))

(defmulti add-vertex dispatch-fn)
(defmethod add-vertex :empty [] (add-vertex nil nil))
(defmethod add-vertex :number [id] (add-vertex id nil))
(defmethod add-vertex :map [props] (add-vertex nil props))
(defmethod add-vertex :number-and-map [id props] ...)
(defmethod add-vertex :error [& args] ...)
票数 2
EN

Stack Overflow用户

发布于 2012-04-17 16:13:57

您没有使用类型提示,而是编写类文字作为计算调度函数所依据的值。您的问题是,即使只有一个类型,您也没有将所有类型包含在一个向量中()。

我强烈建议你在multimethods上使用read up

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10187223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档