【问题标题】:Create new sequence from existing从现有序列创建新序列
【发布时间】:2015-04-24 18:34:34
【问题描述】:

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

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

【问题讨论】:

    标签: clojure


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你也可以试试for:

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

      【讨论】:

        猜你喜欢
        • 2012-05-19
        • 2021-01-02
        • 2015-07-27
        • 2010-09-15
        • 1970-01-01
        • 2018-09-24
        • 2018-12-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多