2013-05-01 18 views
3

快速clojure問題,我認爲這主要是語法相關的。我如何調度基礎上的論點特定類型簽名一個多重方法,例如:Clojure:defmulti對不同類的類型

(defn foo 
    ([String a String b] (println a b)) 
    ([Long a Long b] (println (+ a b)) 
    ([String a Long b] (println a (str b)))) 

我想將其擴展到任意的東西,如兩個字符串後面的地圖,以地圖後跟雙,雙雙打接着是干擾素等..

回答

6
(defn class2 [x y] 
    [(class x) (class y)]) 

(defmulti foo class2) 

(defmethod foo [String String] [a b] 
    (println a b)) 

(defmethod foo [Long Long] [a b] 
    (println (+ a b))) 

從REPL:

user=> (foo "bar" "baz") 
bar baz 
nil 
user=> (foo 1 2) 
3 
nil 

你也可以考慮使用type代替class; type返回:type元數據,如果沒有,則委託給class

另外,class2不必在頂層定義;作爲派遣功能(fn [x y] ...)defmulti也很好。