您好,匿名用户
随意问技术百科期待您的加入

clojure的apply和reduce有什么区别么

0 投票

这篇文章的时候想到的这个问题

我发现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不太懂,处于撞大运式编程阶段,可能词不达意,还请请拍。

用户头像 提问 2014年 1月27日 @ Kayle 上等兵 (277 威望)
分享到:

1个回答

0 投票
 
最佳答案

reduce是对coll代表的seq做迭代式的运算,如下:

(reduce + [1 2 3 4]) ;; => (+ 4 (+ 3 (+ 1 2))) 
(reduce conj #{} [:a :b :c]) ;; => (conj (conj #{} :a) :b) :c)
(reduce into [[1 2 3] [:a :b :c] '([4 5] 6)]) ;; => (into (into [1 2 3] [:a :b :c]) '([4 5] 6))

而apply的含义是调用f,并以args作为参数(如果args中含有seq,则首先拆散这个seq并将其中的每个element都当做一个参数),如下:

(let [s ["str1" "str2" "str3"]]
  (apply str s)) 
;; => (str "str1" "str2" "str3")
(apply + 1 2 '(3 4)) ;; => (+ 1 2 3 4)

关于“这两个函数之间是否通用”的说法不太正确,这个界限是模糊的,关键在于在哪些应用场景中这个函数的功能正好满足你的需要。

用户头像 回复 2014年 1月27日 @ Nidalee 上等兵 (346 威望)
选中 2013年 9月7日 @Kayle
提一个问题:

相关问题

+2 投票
1 回复 302 阅读
0 投票
1 回复 31 阅读
用户头像 提问 2013年 9月11日 @ Emiya Shirou 上等兵 (438 威望)
+3 投票
1 回复 84 阅读
0 投票
1 回复 45 阅读
0 投票
1 回复 39 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...