Clojure 如何正确使用还原成

Clojure 如何正确使用还原成,clojure,Clojure,我正在学习Clojure,实际上我正在做一些练习,但我遇到了一个问题: 我需要创建一个sum continuetives函数,对数组中的连续元素求和,从而生成一个新的元素,例如: [1,4,4,4,0,4,3,3,1] ; should return [1,12,0,4,6,1] 我制作了这个功能,它应该可以正常工作: (defn sum-consecutives [a] (reduce #(into %1 (apply + %2)) [] (partition-by identity

我正在学习Clojure,实际上我正在做一些练习,但我遇到了一个问题:

我需要创建一个
sum continuetives
函数,对数组中的连续元素求和,从而生成一个新的元素,例如:

[1,4,4,4,0,4,3,3,1]  ; should return [1,12,0,4,6,1]
我制作了这个功能,它应该可以正常工作:

(defn sum-consecutives [a]
  (reduce #(into %1 (apply + %2)) [] (partition-by identity a)))
但它抛出了一个错误:

IllegalArgumentException不知道如何从以下位置创建ISeq: java.lang.Long clojure.lang.RT.seqFrom(RT.java:542)

谁能帮我看看我的func有什么问题吗?我已经在web上搜索了此错误,但没有找到任何有用的解决方案。

您可能希望在
中使用而不是
,因为
into
希望其第二个参数是:

或者,如果您真的想在
中使用
,您可以将对
apply+
的调用包装为向量文字,如下所示:

(defn sum-consecutives [a]
  (reduce 
    #(into %1 [(apply + %2)])
    [] 
    (partition-by identity a)))

分区开始,您的方法是合理的。但是让我们
完成以下步骤,对生成的每个子序列求和

(let [xs [1 4 4 4 0 4 3 3 1]]
  (partition-by identity xs))  ;=> ((1) (4 4 4) (0) (4) (3 3) (1))
要得到一个总数,您可以使用
reduce
(尽管是一个简单的
apply
相反 这里);e、 g:

现在用
map
,将所有这些放在一起,减少上面的每个子序列:

(let [xs [1 4 4 4 0 4 3 3 1]]
  (map #(reduce + %) (partition-by identity xs)))  ;=> (1 12 0 4 6 1)
几点注意事项。。。 我使用
xs
来表示向量(如 )

let
有时是一种方便的形式,用于试验一些 为最终功能建立数据

逗号是不需要的,通常会分散注意力,偶尔除外 使用哈希映射

因此,基于所有这些的最终函数可能看起来像:

(defn sum-consecutives [coll]
  (map #(reduce + %) (partition-by identity coll)))

谢谢你的决心和建议。我会仔细考虑的你的conj决议很好,正好显示了我遗漏了什么。我将更深入地研究这些函数。谢谢你的帮助
(let [xs [1 4 4 4 0 4 3 3 1]]
  (map #(reduce + %) (partition-by identity xs)))  ;=> (1 12 0 4 6 1)
(defn sum-consecutives [coll]
  (map #(reduce + %) (partition-by identity coll)))