从现有序列创建新序列
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))
我正在尝试学习一些 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))