clojure - 如何正确使用reduce和into

标签 clojure

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

我需要创建一个 sum-consecutives 函数,它将数组中的连续元素相加,从而产生一个新元素,例如:

[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 Don't know how to create ISeq from: java.lang.Long clojure.lang.RT.seqFrom (RT.java:542)

谁能帮我看看我的函数出了什么问题吗?我已经在网上搜索过此错误,但没有找到有用的解决方案。

最佳答案

您可能想要使用conj而不是 into,因为 into 期望它的第二个参数是 seq :

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

(sum-consecutives [1,4,4,4,0,4,3,3,1]) ;; [1 12 0 4 6 1]

或者,如果您确实想要使用 into,您可以将对 apply + 的调用包装在矢量文字中,如下所示:

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

关于clojure - 如何正确使用reduce和into,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45156101/

相关文章:

if-statement - 在 Clojure 函数中编写多个 if 检查的更好方法?

macros - 宏中的 clojure 引号和代字号

mysql - Jdbc (mysql) unicode 行为

clojure - httpclient默认会使用系统代理(clojure)吗?

Clojure:将序列拆分为前n个序列和其余序列?

clojure - 如何列出命名空间的功能?

clojure - 为什么我在下面的代码中会得到NPE?

clojure - 符合规范/AST 的规范

clojure - ArityException 传递给 : core/max 的参数数量 (0) 错误

http - Clojure 黑色 : how to set up basic authentication for only a part of the application