[英]Wrong arity of simple function in clojure
我已經開始學習Clojure。 我的書中有以下練習:
編寫一個函數mapset,它的功能類似於map,只是返回值是一個set:
(mapset inc [1 1 2 2])
; => #{2 3}
我開始是這樣的:
(defn mapset
[vect]
(set vect))
結果是錯誤
“傳遞給:core / mapset的錯誤數量的args(2)”
我也嘗試過[& args]
。
所以,問題是:我該如何解決這個問題?
你的定義mapset
只有一個參數vect
至少需要使用2個參數,一個函數和一個序列
(defn mapset [f xs] (set (map f xs)))`
但是,考慮到這也是有趣的,因為這也包含兩個功能:
(def mapset (comp set map))
仔細看看您對mapset
的調用:
(mapset inc [1 1 2 2])
由於代碼是數據,因此此“調用”只是三個元素的列表:
mapset
inc
[1 1 2 2]
當您評估此代碼時,Clojure將看到它是一個列表,並繼續評估該列表中的每個項目(一旦確定它不是特殊格式或宏),因此它將有一個新的列表。三個要素:
core/mapset
綁定到的函數 clojure.core/inc
綁定到的函數 [1 1 2 2]
最后,Clojure將使用其余元素作為參數調用列表的第一個元素。 在這種情況下,列表的其余部分有兩個參數,但是在函數定義中,您只占了一個:
(defn mapset
[vect]
(set vect))
為了解決這個問題,您可以如下實現mapset
:
(defn mapset
[f vect]
(set (map f vect)))
現在,當您調用(mapset inc [1 1 2 2])
,將在函數clojure.core/inc
找到參數f
,並將參數vect
綁定到向量[1 1 2 2]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.