clojure.lang.LazySeq无法强制转换为clojure.lang.IFn嵌套for loop clojure

时间:2015-04-08 18:57:09

标签: for-loop vector clojure nested

我是clojure和函数式编程的新手,所以我很感激一些帮助。 :)

我想要做的是:我想要得到这个 [1 1 2]来自这个“结构”[[1 0 1] [0 1 0] [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 ......我做错了什么?

1 个答案:

答案 0 :(得分:2)

问题是((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]