这里的论点是什么?

时间:2016-01-20 20:28:03

标签: clojure

我是clojure的新手。 我有这个

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

%1和%2参数是哪个? 我明白了

(flatten (cons 1 2 3)

将返回一个lazy-seq,只为#()函数提供一个参数

1 个答案:

答案 0 :(得分:3)

让我们看看reduce

the docs
  

(reduce f coll) (reduce f val coll)

     

f应该是2个参数的函数。如果没有提供val,   返回将f应用于coll中的前2项的结果   将f应用于该结果和第3项等如果coll包含否   items,f也必须不接受任何参数,并且reduce返回   调用没有参数的f的结果。如果coll只有1个项目,那么   返回并且不调用f。如果提供了val,则返回   然后将f应用于val和coll中的第一项的结果   将f应用于该结果和第二项等。如果coll包含否   items,返回val和f不会被调用。

因此它将函数应用于列表中的下一个项目,以及上一次调用的结果(第一次使用列表中的前两项)。

想象一下,你这样称呼你的函数:

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

首先使用12调用它,返回2。然后,将使用结果[{1}}和下一个项2调用它,然后返回3。然后使用结果[{1}}和下一个项3调用它,并返回3作为最终结果。

每个步骤都使用上一次调用的结果作为下一次的第一个参数。