Clojure-如何实现还原功能但放弃状态?

Clojure-如何实现还原功能但放弃状态?,clojure,reduce,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

如果我这样使用缩减函数:

(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])

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

(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)

您可以使用地图:

(map f coll (rest coll))
如果您想要一个函数:

(defn map-pairwise [f coll]
  (map f coll (rest coll)))
如果您确实需要第一个元素保持不变(thanx to):


分区
将对您的序列进行分组:

user> (->> [1 2 3 4 5] (partition 2 1) (map #(apply + %)) (cons 1))
(1 3 5 7 9)
这就足够了:

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

我认为结果中缺少第一个元素:)。也许
(defn magic hof[f[x&xs:as s]](conj(map f s xs)x))
?magic hof版本无法正确处理空序列:
(magic hof+[])
=>
(nil)
。但话说回来,这取决于这里“正确”的含义也许,
(defn magic[fs](map f(list*(f)s)s))
对于某些
f
s.@A.Webb并非所有两个变量函数都支持
(f)
调用。不,因此是“some”,但为了模拟减少的行为,在对空集合调用时应该返回
(f)
,我的“maybe”函数也不能这样做。如果需要这种行为的话,简洁性将不得不让位一点。这很简单。这很好,因为它只对列表的一个版本进行操作。
(#(map + (cons 0 %) %) [1 2 3 4 5])
;; => (1 3 5 7 9)