Clojure 从现有序列创建新序列

Clojure 从现有序列创建新序列,clojure,Clojure,我正试着学习一些clojure,现在我被困在序列中了。 我不想从现有序列创建新序列,但新序列必须只包含顶级元素或所有嵌套元素的总和。例如,从“(12(34))中必须有“(12 7)。我想我的方法是正确的,但我有一个错误: user=> (make-new '(1 2 (3 4))) IllegalArgumentException Don't know how to create ISeq from: java.lang.Long clojure.lang.RT.seqFrom (

我正试着学习一些clojure,现在我被困在序列中了。 我不想从现有序列创建新序列,但新序列必须只包含顶级元素或所有嵌套元素的总和。例如,从“(12(34))中必须有“(12 7)。我想我的方法是正确的,但我有一个错误:

user=> (make-new '(1 2 (3 4)))
IllegalArgumentException Don't know how to create ISeq from: java.lang.Long 
   clojure.lang.RT.seqFrom (RT.java:505)   
这是我的密码:

(defn sum
[list]
(reduce + (into-array (flatten list))))

(defn make-head
 [item]
 (if (seq? (first item))
  (sum (first item))
  item
 ))

(defn make-new
 [list]
 (cons(make-head (first list)) (seq (make-new (rest list)))))

希望有人能帮助我。谢谢。

制作头部
中删除
第一个
,因为您已经从
制作新的
中调用了
第一个

(defn make-head [item]
  (if (seq? item)
    (sum item)
    item))
另外,只需在
新建中使用
(地图制作标题列表)
。无需自行实施
map

(defn make-new [list]
  (map make-head list))
最后,
+
已经减少了(它是可变的),所以您可以像这样实现
sum

(defn sum [list]
  (apply + (flatten list))

一种更简洁的方法,利用
(展平[42])
导致
(42)


您也可以尝试
查看

(for [i '(1 2 (3 4))]
  (if (seq? i)
    (reduce + i)
    i))
(for [i '(1 2 (3 4))]
  (if (seq? i)
    (reduce + i)
    i))