【问题标题】:How to evaluate elements in nested vectors in Clojure如何在 Clojure 中评估嵌套向量中的元素
【发布时间】:2015-12-03 10:56:51
【问题描述】:

我对 Clojure 很陌生,上周才开始学习它。我正在尝试以这种形式评估向量的嵌套向量:

[[1 2] [3 1] [-1 0]] 表示多项式,因此向量表示: x^2 + 3*x - 1(每组第一个数字为系数,第二个为指数)

我有一个名为 eval-term() 的函数,它接受一个数字输入并为每个术语计算 ((number^exponent)*coefficient),所以我希望它遍历嵌套向量 [[1 2] [3 1] [-1 0]] 并基本上评估 @987654325 @ 然后[3 1] 然后[-1 0]

我收到一个错误:

clojure.lang.Compiler$CompilerException: java.lang.IllegalArgumentException: Don't know how to create ISeq from: user$make_poly$fn__11617, compiling:(null:53:1)
          Compiler.java:3463 clojure.lang.Compiler$InvokeExpr.eval
           Compiler.java:408 clojure.lang.Compiler$DefExpr.eval
          Compiler.java:6624 clojure.lang.Compiler.eval
          Compiler.java:6608 clojure.lang.Compiler.eval
          Compiler.java:6582 clojure.lang.Compiler.eval
               core.clj:2852 clojure.core/eval
                 eval.clj:77 lighttable.nrepl.eval/->result
                AFn.java:163 clojure.lang.AFn.applyToHelper
                AFn.java:151 clojure.lang.AFn.applyTo
                core.clj:619 clojure.core/apply
               core.clj:2396 clojure.core/partial[fn]
             RestFn.java:408 clojure.lang.RestFn.invoke
               core.clj:2487 clojure.core/map[fn]
             LazySeq.java:42 clojure.lang.LazySeq.sval
             LazySeq.java:60 clojure.lang.LazySeq.seq
                 RT.java:484 clojure.lang.RT.seq
                core.clj:133 clojure.core/seq
               core.clj:2523 clojure.core/filter[fn]
             LazySeq.java:42 clojure.lang.LazySeq.sval
             LazySeq.java:67 clojure.lang.LazySeq.seq
                Cons.java:39 clojure.lang.Cons.next
                 RT.java:598 clojure.lang.RT.next
                 core.clj:64 clojure.core/next
               core.clj:2781 clojure.core/dorun
               core.clj:2796 clojure.core/doall
                eval.clj:126 lighttable.nrepl.eval/eval-clj
             RestFn.java:442 clojure.lang.RestFn.invoke
               sonar.clj:215 lighttable.nrepl.sonar/eval5570[fn]
                AFn.java:159 clojure.lang.AFn.applyToHelper
                AFn.java:151 clojure.lang.AFn.applyTo
                core.clj:617 clojure.core/apply
               core.clj:1788 clojure.core/with-bindings*
             RestFn.java:425 clojure.lang.RestFn.invoke
               sonar.clj:203 lighttable.nrepl.sonar/eval5570[fn]
            MultiFn.java:227 clojure.lang.MultiFn.invoke
                 core.clj:98 lighttable.nrepl.core/queued[fn]
               core.clj:2330 clojure.core/comp[fn]
  interruptible_eval.clj:138 clojure.tools.nrepl.middleware.interruptible-eval/run-next[fn]
                 AFn.java:24 clojure.lang.AFn.run
ThreadPoolExecutor.java:1142 java.util.concurrent.ThreadPoolExecutor.runWorker
 ThreadPoolExecutor.java:617 java.util.concurrent.ThreadPoolExecutor$Worker.run
             Thread.java:745 java.lang.Thread.run
Caused by: java.lang.IllegalArgumentException: Don't know how to create ISeq from: user$make_poly$fn__11617
                 RT.java:505 clojure.lang.RT.seqFrom
                 RT.java:486 clojure.lang.RT.seq
                core.clj:133 clojure.core/seq
            protocols.clj:26 clojure.core.protocols/seq-reduce
            protocols.clj:41 clojure.core.protocols/fn
            protocols.clj:13 clojure.core.protocols/fn[fn]
               core.clj:6175 clojure.core/reduce
            (Unknown Source) user/make-poly
                AFn.java:161 clojure.lang.AFn.applyToHelper
                AFn.java:151 clojure.lang.AFn.applyTo
          Compiler.java:3458 clojure.lang.Compiler$InvokeExpr.eval

我觉得我的

(defn poly-maker [polyvector]
  (reduce + #(map eval-term polyvector %))
)

是错误的,因为“地图”没有遍历[[1 2] [3 1] [-1 0]] 中的集合并一次评估它们。我不知道如何解决这个问题,请帮忙!

【问题讨论】:

    标签: dictionary vector clojure nested reduce


    【解决方案1】:

    你想要这样的东西:

    (defn poly-maker [polyvector]
      (fn [x] (reduce + (map #(eval-term % x) polyvector))))
    
    (def example (poly-maker [[1 2] [3 1] [-1 0]]))
    
    ;TEST
    (example 3)
    

    请注意,结果是 17,而不是 9。


    你的表述是错误的:你可以有两个或多个相同系数的值,例如[[1 2] [3 2]]

    所以使用映射:功率 -> 系数。例如,{2 1, 1 3, 0 -1} 而不是 [[1 2] [3 1] [-1 0]]

    【讨论】:

    • 太完美了!太感谢了。我认为添加 fn [x] 和 (map #( 是我需要的,但我不知道。
    猜你喜欢
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多