Clojure 从现有序列创建新序列
我正试着学习一些clojure,现在我被困在序列中了。 我不想从现有序列创建新序列,但新序列必须只包含顶级元素或所有嵌套元素的总和。例如,从“(12(34))中必须有“(12 7)。我想我的方法是正确的,但我有一个错误:Clojure 从现有序列创建新序列,clojure,Clojure,我正试着学习一些clojure,现在我被困在序列中了。 我不想从现有序列创建新序列,但新序列必须只包含顶级元素或所有嵌套元素的总和。例如,从“(12(34))中必须有“(12 7)。我想我的方法是正确的,但我有一个错误: user=> (make-new '(1 2 (3 4))) IllegalArgumentException Don't know how to create ISeq from: java.lang.Long clojure.lang.RT.seqFrom (
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)))))
希望有人能帮助我。谢谢。从
制作头部
中删除第一个
,因为您已经从制作新的
中调用了第一个
:
(defn make-head [item]
(if (seq? item)
(sum item)
item))
另外,只需在新建中使用(地图制作标题列表)
。无需自行实施map
(defn make-new [list]
(map make-head list))
最后,+
已经减少了(它是可变的),所以您可以像这样实现sum
:
(defn sum [list]
(apply + (flatten list))
一种更简洁的方法,利用(展平[42])
导致(42)
:
您也可以尝试查看:
(for [i '(1 2 (3 4))]
(if (seq? i)
(reduce + i)
i))
(for [i '(1 2 (3 4))]
(if (seq? i)
(reduce + i)
i))