reduce
调用首先使用其f
参数。从视觉上看,这通常是表单中最大的部分。
例如:(reduce
(fn [[longest current] x]
(let [tail (last current)
next-seq (if (or (not tail) (> x tail))
(conj current x)
[x])
new-longest (if (> (count next-seq) (count longest))
next-seq
longest)]
[new-longest next-seq]))
[[][]]
col))
问题在于,
val
参数(在本例中为[[][]]
)和col
参数出现在下方,需要你的眼睛长途跋涉才能将其与f
的参数匹配。
如果按照以下顺序排列,会更易读:
(reduceb val col
(fn [x y]
...))
我应该实现这个宏,还是一开始就完全错了?
reduce
能够解决的一小部分问题也可以通过iterate
解决。但是同样地,map
、filter
和其他无数个函数根据你要解决的问题而言,可能会比reduce
更易读。我肯定不会将iterate
提名为一个突出的替代者,并且它对于这个问题没有任何帮助。 - amalloyreduce
函数将随着使用而变得更易读。 - ctpenrosetail
是(last current)
。通常期望看到tail
是next
或rest
的结果。 - Chris Murphy