Clojure 如何正确使用还原成
我正在学习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
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)))