首页 文章

从现有创建新序列

提问于
浏览
1

我正在努力学习一些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)))))

希望可以有人帮帮我 . 谢谢 .

2 回答

  • 3

    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))
    
  • 0

    你也可以试试 for

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

相关问题