如何在Clojure中评估嵌套向量中的元素

时间:2015-09-07 21:26:54

标签: dictionary vector clojure nested reduce

我是Clojure的新手,上周开始学习它。我试图以这种形式评估向量的嵌套向量:

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

我有一个名为eval-term()的函数,它接受一个数字输入并为每个术语计算((number^exponent)*coefficient),所以我希望它迭代嵌套的向量[[1 2] [3 1] [-1 0]]和基本上评估[1 2]然后评估[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]]中的集合并一次评估一个。我不知道如何解决这个问题,请帮忙!

1 个答案:

答案 0 :(得分: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]]

所以使用地图:power - >系数。例如,{2 1, 1 3, 0 -1}而不是[[1 2] [3 1] [-1 0]]