从现有

时间:2015-04-22 13:14:31

标签: clojure

我正在尝试学习一些clojure,现在我已经卡住了whith序列。 我想从现有的创建一个新序列,但是newone必须只包含顶级元素或所有嵌套的总和。例如,从'(1 2(3 4))必须有'(1 2 7)。我想我是正确的方法来钉它,但我有一个错误:

(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)))))

这是我的代码:

{{1}}

希望有人可以帮助我。感谢。

2 个答案:

答案 0 :(得分:3)

first移除make-head,因为您已经从first致电make-new

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

另外,只需在(map make-head list)中使用make-new即可。没有必要自己实施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))

答案 1 :(得分:0)

您也可以尝试for

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