【问题标题】:clojure.lang.LazySeq cannot be cast to clojure.lang.IFn nested for loops clojureclojure.lang.LazySeq 不能强制转换为 clojure.lang.IFn 嵌套 for 循环 clojure
【发布时间】:2015-06-13 21:49:52
【问题描述】:

我是 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 ...我做错了什么?

【问题讨论】:

    标签: for-loop vector clojure nested


    【解决方案1】:

    问题是((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 在传入更多参数时会做正确的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 2012-11-06
    • 1970-01-01
    • 2020-11-26
    相关资源
    最近更新 更多