2
我想在Clojure中編寫自定義的max
函數,它應該支持一個或多個參數。但是,我遇到了一個我無法弄清楚的錯誤。這裏是以下功能:Clojure中的可變參數錯誤
(defn my-max [arg & rest]
(loop [m arg c rest]
(cond (empty? c) m
(> m (first c)) (recur m (rest c))
:else (recur (first c) (rest c)))))
我遇到試圖評估該功能時,出現以下錯誤:
user> (my-max 2 3 1 4 5)
ClassCastException clojure.lang.ArraySeq cannot be cast to clojure.lang.IFn user/my-max (NO_SOURCE_FILE:5)
我認爲這會工作,因爲我是在假設rest
只是一個序列。我能夠使這個函數在沒有可變簽名的情況下工作,其中參數只是一個序列:
(defn my-max [coll]
(loop [m (first coll) c (rest coll)]
(cond (empty? c) m
(> m (first c)) (recur m (rest c))
:else (recur (first c) (rest c)))))
是的,就是這樣。我不知道爲什麼我以前沒有看到 - 有時需要進行完整性檢查。 – dtg
這也許是我們可能希望看到某些編譯器警告的地方。 –
@A。 Webb - 同意,這正是我們爲什麼需要在Clojure中進行更多靜態類型檢查的原因。會馬上拿起這種東西。 – mikera