簡體   English   中英

Clojure中的簡單功能錯誤

[英]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])

由於代碼是數據,因此此“調用”只是三個元素的列表:

  1. 符號mapset
  2. 符號inc
  3. 向量[1 1 2 2]

當您評估此代碼時,Clojure將看到它是一個列表,並繼續評估該列表中的每個項目(一旦確定它不是特殊格式或宏),因此它將有一個新的列表。三個要素:

  1. 符號core/mapset綁定到的函數
  2. 符號clojure.core/inc綁定到的函數
  3. 向量[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM