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