我是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,只为#()函数提供一个参数
答案 0 :(得分:3)
让我们看看reduce
(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))
首先使用1
和2
调用它,返回2
。然后,将使用结果[{1}}和下一个项2
调用它,然后返回3
。然后使用结果[{1}}和下一个项3
调用它,并返回3
作为最终结果。
每个步骤都使用上一次调用的结果作为下一次的第一个参数。