For loop clojure.lang.LazySeq不能强制转换为clojure.lang.IFn嵌套循环clojure

For loop clojure.lang.LazySeq不能强制转换为clojure.lang.IFn嵌套循环clojure,for-loop,vector,clojure,nested,For Loop,Vector,Clojure,Nested,我不熟悉clojure和函数式编程,因此我希望能得到一些帮助。:) 我想做的是:我想得到这个 [1 1 2]从这个“结构”[[1 0 1][0 1 0][0 1]]因此,我尝试对三个向量的第一个元素、三个向量的第二个元素以及三个向量的最后三个元素求和,以得到一个最终包含这些和的新向量 我的代码如下: (def matrix [[1 0 1] [0 1 0] [0 0 1]]) (def sum (atom 0)) (def sum-vector (atom [])) (for [i (r

我不熟悉clojure和函数式编程,因此我希望能得到一些帮助。:)

我想做的是:我想得到这个 [1 1 2]从这个“结构”[[1 0 1][0 1 0][0 1]]因此,我尝试对三个向量的第一个元素、三个向量的第二个元素以及三个向量的最后三个元素求和,以得到一个最终包含这些和的新向量

我的代码如下:

(def matrix [[1 0 1] [0 1 0] [0 0 1]])
(def sum (atom 0))
(def sum-vector (atom []))
    (for [i (range 3)]                
       ((for [j (range (count matrix))]
               (reset! sum (+ @sum (nth (nth matrix j) i)))
                     ) 
               (reset! sum-vector (conj @sum-vector @sum))
               (reset! sum 0)
                 ))
但我有一个例外:clojure.lang.LazySeq不能被转换为clojure.lang.IFn。。。我做错了什么?

问题是
((for…)
,即评估
(for…)
表单,然后获取结果并执行它。
(for…
返回的是LazySeq,而不是函数

(apply map + [[1 0 1] [0 1 0] [0 0 1]])
;; (1 1 2)
如果希望返回向量而不是LazySeq:

(apply mapv + [[1 0 1] [0 1 0] [0 0 1]])
;; [1 1 2]

令人惊叹的!谢谢我必须研究部分,还没有到那部分。
partial
完全可以避免
(apply mapv+…)
也起作用,因为当传入更多参数时,
apply
做的事情是正确的。