Clojure - 如何减少功能但降低状态?

时间:2013-12-16 13:00:47

标签: clojure reduce

如果我像这样使用缩减功能:

(reductions + [1 2 3 4 5])

然后我得到

(1 3 6 10 15)

哪个好 - 但是我希望以相同的方式应用二元函数而不会使状态继续进行 - 比如

(magic-hof + [1 2 3 4 5])

导致

(1 3 5 7 9)

即它返回应用于第一对的操作,然后步骤1到下一对。

有人能告诉我正在寻找的高阶函数吗? (像缩减一样)

这是我的(非工作)去吧:

(defn thisfunc [a b] [(+ a b) b])

(reduce thisfunc [1 2 3 4 5])

4 个答案:

答案 0 :(得分:9)

您可以使用地图:

(map f coll (rest coll))

如果你想要一个功能:

(defn map-pairwise [f coll]
  (map f coll (rest coll)))

如果你真的需要第一个元素保持不变(thanx到juan.facorro's comment):

(defn magic-hof [f [x & xs :as s]]
  (cons x (map f s xs)))

答案 1 :(得分:5)

partition会将您的序列分组:

user> (->> [1 2 3 4 5] (partition 2 1) (map #(apply + %)) (cons 1))
(1 3 5 7 9)

答案 2 :(得分:0)

那么,您想将函数应用于后续的元素对吗?

(defn pairwise-apply
  [f sq]
  (when (seq sq)
    (->> (map f sq (next sq))
         (cons (first sq)))))

我们试一试:

(pairwise-apply + (range 1 6))
;; => (1 3 5 7 9)

答案 3 :(得分:0)

这就足够了:

(#(map + (cons 0 %) %) [1 2 3 4 5])
;; => (1 3 5 7 9)