clojure的apply和reduce有什么区别么

发布于 2022-08-24 23:25:04 字数 684 浏览 10 评论 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不太懂,处于撞大运式编程阶段,可能词不达意,还请请拍。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

↘人皮目录ツ 2022-08-31 23:25:04

完全不同,简单来说apply的作用是将一个列表直接作为函数的参数表调用,如

(apply func [item1 item2 item3])

等价于

(func item1 item2 item3)

但不等价于

(reduce func [item1 item2 item3])

事实上reduce的作用是将一个sequence的前两项应用func,将返回的结果在和第三项一起使用func,以此类推
所以事实上

(reduce func [item1 item2 item3])

等价于

(func (func item1 item2) item3)

同时

(reduce func [item1 item2 item3 item4])

等价于

(func (func (func item1 item2) item3) item4)

所以说

(apply + (range 5))

等价于

(+ 0 1 2 3 4 5)

(reduce + (range 5))

等价于

(+ 
  (+ 
    (+ 
      (+ 
        (+ 0 
           1) 
        2) 
      3) 
    4) 
  5)

对于加法而言这两个式子自然是等值的。。。

一般来说如果应用的f不是可变参数并且满足结合律的,apply和reduce不能混用
反之不一定。。。。

寂寞花火° 2022-08-31 23:25:04

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)

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

浅紫色的梦幻 2022-08-31 23:25:04

参考

(apply vector [1 2 3 4 5])
(reduce vector [1 2 3 4 5])

这两个结果有何不同就知道了。

等待我真够勒 2022-08-31 23:25:04

apply 用来去括号
reduce 将具有多个元素的集合转为一个元素,多到一
reduce的第二个参数 (fn [s a] ...) 可以看作为 F(sn an)返回了 sn+1

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文