2016-02-18 69 views
1

是否有內置的方法只將第n個參數傳遞給另一個函數。考慮這個問題:只傳遞第n個參數

(defn nth-arg [i & args] 
    (nth args i)) 

和方便:

(def arg1 (partial nth-arg 0)) 
(def arg2 (partial nth-arg 1)) 
(def arg3 (partial nth-arg 2)) 

這將使得能夠避免同樣的結構(FN [_ _ X](富X)):

(comp foo arg3) 
+2

你能舉一個實際功能的例子嗎? –

+0

實際上,我通過後面的代碼碰到了這個問題,你只是回答了這個問題:http://stackoverflow.com/questions/35470950/getting-the-positions-of-the-occurrences-of-one-item-in- a-sequence/35471392?noredirect = 1#comment58638472_35471392 –

+2

在傳遞給'filter'的匿名函數中,實際上是解構一個向量,*不是*取第二個參數。你可以將它改寫爲'(comp(partial = item)second)'。 –

回答

1

無只接受將在你的函數中使用的參數是很好的風格。如果您認爲便於接受更多信息,請考慮轉換輸入。保持函數應用程序和數據選擇之間的區別是件好事。

有時你會被迫創建不使用第一個參數的函數,例如在定義協議時,通常不需要參數this,所以你只是放棄它。在這裏,最好是明確並直接瞭解正在發生的事情。你不會通過委託給另一個函數來使代碼更優雅,這是讀者遵循的另一個精神步驟。

避免vardic行爲,當它不利於你。你正在犧牲一個真正的好處(合格檢查)。它打開你難以推理的錯誤(opps我應該應用該向量,而不是傳遞!當我重構了4個參數,而不是3後,不需要第二個參數)。