如果我像这样使用缩减功能:
(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])
答案 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)