2016-01-20 155 views
0

我是一個真正的clojure新手。 我有這個這裏有哪些參數?

(defn max-val [x & xs] 
    (reduce #(if (< %1 %2) %2 %1) (flatten (cons x xs)))) 

哪個是%1和%2參數? 據我所知,

(flatten (cons 1 2 3) 

將返回一個懶序列,使得只有一個參數的#()函數

+0

你問如何使用減少?或者你問如何使用#(...%...%1 ...%n ...)語法構建匿名函數? –

+0

'(cons 1 2 3)'根本不會返回一個懶惰的seq:給'cons'多於2個參數是錯誤的,或者第二個參數不是順序的。 – amalloy

回答

3

讓我們來看看the docsreduce

(reduce f coll) (reduce f val coll)

˚F應該是2個參數的函數。如果未提供val,則 返回將結果應用於coll中的前2項,然後 將f應用於該結果和第3項等。如果coll不包含 項,則f必須不接受任何參數那麼,並減少返回 結果調用f沒有參數。如果coll只有1個項目,則返回 ,並且不調用f。如果提供了val,則返回將結果應用於val和coll中的第一項的 結果,然後 將f應用於該結果以及第二項等。如果coll不包含 項,則返回val和f不會被調用。

因此,它將函數應用於列表中的下一個項目以及前一個調用的結果(第一次使用列表中的前兩個項目)。

想象一下,你打電話給你的功能是這樣的:

(reduce #(if (< %1 %2) %2 %1) '(1 2 3 4)) 

它將首先與12被調用,返回2。然後將調用結果2和下一個項目3,並返回3。然後調用結果3和下一個項目4,並返回4作爲最終結果。

每一步都將先前調用的結果作爲下一次的第一個參數。