从现有序列创建新序列

Create new sequence from existing

我正在尝试学习一些 clojure,但现在我被序列卡住了。 我想从现有序列创建一个新序列,但 newone 必须仅包含顶级元素或所有嵌套元素的总和。例如,从 '(1 2 (3 4)) 必须有 '(1 2 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)))))

希望有人能帮助我。谢谢

make-head 中删除 first,因为您已经从 make-new 调用 first:

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

此外,只需在make-new中使用(map make-head list)。无需自己实施 map:

(defn make-new [list]
  (map make-head list))

最后,+ 已经减少了(它是可变的),所以你可以像这样实现 sum

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

一种更简洁的方法,利用 (flatten [42]) 结果为 (42):

(defn make-new [xs]
  (map #(apply + (flatten [%])) xs))

您也可以尝试 for:

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