这里有哪些参数?
问题描述:
我是一个真正的clojure新手。 我有这个这里有哪些参数?
(defn max-val [x & xs]
(reduce #(if (< %1 %2) %2 %1) (flatten (cons x xs))))
哪个是%1和%2参数? 据我所知,
(flatten (cons 1 2 3)
将返回一个懒序列,使得只有一个参数的#()函数
答
让我们来看看the docs为reduce
(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))
它将首先与1
和2
被调用,返回2
。然后将调用结果2
和下一个项目3
,并返回3
。然后调用结果3
和下一个项目4
,并返回4
作为最终结果。
每一步都将先前调用的结果作为下一次的第一个参数。
你问如何使用减少?或者你问如何使用#(...%...%1 ...%n ...)语法构建匿名函数? –
'(cons 1 2 3)'根本不会返回一个懒惰的seq:给'cons'多于2个参数是错误的,或者第二个参数不是顺序的。 – amalloy