看这篇文章的时候想到的这个问题
我发现reduce和apply这两个函数很多时候都可以换着用。
那么在写代码的时候,什么时候应该用apply,什么时候应该用reduce呢?
什么时候不能通用呢?
他们的相同点和不同点是clojure独有的呢还是函数式语言共有的呢?
关于不能通用,刚好有个例子,4clojure的第32题,我的解法是这样的:
reduce #(conj %1 %2 %2) []
把reduce换成apply就会报错。
对于以下两种形式,apply和reduce是可以通用的?(这个是我瞎猜的,代码参见clojure docs)
(reduce f coll)
(apply f a b c d & args)
对clojure不太懂,处于撞大运式编程阶段,可能词不达意,还请请拍。
完全不同,简单来说apply的作用是将一个列表直接作为函数的参数表调用,如
等价于
但不等价于
事实上reduce的作用是将一个sequence的前两项应用func,将返回的结果在和第三项一起使用func,以此类推
所以事实上
等价于
同时
等价于
所以说
等价于
而
等价于
对于加法而言这两个式子自然是等值的。。。
一般来说如果应用的f不是可变参数并且满足结合律的,apply和reduce不能混用
反之不一定。。。。