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)