【发布时间】: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