以下Clojureのコードツリーを生成し、それを横断しようとする: - :sheets
ベクトル中の非ゼロ値の数に応じて、4マップClojureのプロデューサ関数から生成されたツリーをトラバースする方法は?
(def rules [[-1 0 0 0] [1 -1 0 0] [1 1 -1 0] [1 1 1 -1]])
(def initial-state {:expected 0.0
:total 4
:sheets [1 1 1 1]
:probs [1.0 1.0 1.0 1.0]})
(defn children-of [{total :total sheets :sheets probs :probs}]
(for [n (range 4) :let [si (sheets n)] :when (> si 0)]
{:expected (if (= total 1) (probs n) 0.0)
:total (+ total (dec n))
:sheets (vector (map + sheets (rules n)))
:probs (vector (map #(* % (/ si total)) probs))}))
(defn all-paths [root]
(?? ... ??)
(doseq [c (all-paths initial-state)]
(println c))
children-of
関数が0の配列を返します。 all-paths
機能を書き込んで
私の最初の試みは、このでした:
(defn all-paths [root]
(lazy-seq (cons root
(for [c (children-of root)]
(all-paths c)))))
しかし、これはclojure.lang.LazySeq cannot be cast to java.lang.Number
ことを私に言ってjava.lang.ClassCastException
秒数をスローします。
したがって、all-paths
の書き方についてのアイデアはありますか?
UPDATE:スタックトレース---------------------
(Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassCastException: clojur
e.lang.LazySeq cannot be cast to java.lang.Number (problem_151.clj:0)
at clojure.lang.Compiler.eval(Compiler.java:5440)
at clojure.lang.Compiler.load(Compiler.java:5857)
at clojure.lang.Compiler.loadFile(Compiler.java:5820)
at clojure.main$load_script.invoke(main.clj:221)
at clojure.main$script_opt.invoke(main.clj:273)
at clojure.main$main.doInvoke(main.clj:354)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.lang.Var.invoke(Var.java:365)
at clojure.lang.AFn.applyToHelper(AFn.java:161)
at clojure.lang.Var.applyTo(Var.java:482)
at clojure.main.main(main.java:37)
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassCastException: clojure.lang.LazySeq ca
nnot be cast to java.lang.Number
at clojure.lang.LazySeq.sval(LazySeq.java:47)
at clojure.lang.LazySeq.seq(LazySeq.java:56)
at clojure.lang.Cons.next(Cons.java:39)
at clojure.lang.RT.next(RT.java:560)
at clojure.core$next.invoke(core.clj:61)
at clojure.core$nthnext.invoke(core.clj:3399)
at clojure.core$print_sequential.invoke(core_print.clj:55)
at clojure.core$fn__4853.invoke(core_print.clj:138)
at clojure.lang.MultiFn.invoke(MultiFn.java:167)
at clojure.core$pr_on.invoke(core.clj:2812)
at clojure.core$pr.invoke(core.clj:2824)
at clojure.lang.AFn.applyToHelper(AFn.java:161)
at clojure.lang.RestFn.applyTo(RestFn.java:132)
at clojure.core$apply.invoke(core.clj:540)
at clojure.core$prn.doInvoke(core.clj:2852)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invoke(core.clj:540)
at clojure.core$println.doInvoke(core.clj:2870)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at user$eval44.invoke(problem_151.clj:21)
at clojure.lang.Compiler.eval(Compiler.java:5424)
... 10 more
Caused by: java.lang.RuntimeException: java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to java.lang.Nu
mber
at clojure.lang.LazySeq.sval(LazySeq.java:47)
at clojure.lang.LazySeq.seq(LazySeq.java:56)
at clojure.lang.RT.seq(RT.java:450)
at clojure.core$seq.invoke(core.clj:122)
at user$all_paths$fn__23$iter__24__28$fn__29.invoke(problem_151.clj:17)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
... 30 more
Caused by: java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to java.lang.Number
at clojure.lang.Numbers.gt(Numbers.java:198)
at user$children_of$iter__4__8$fn__9$fn__10.invoke(problem_151.clj:9)
at user$children_of$iter__4__8$fn__9.invoke(problem_151.clj:9)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
... 35 more
スタックトレースか、私たちはちょうど推測しています。 – amalloy
@amalloy - 私はそれをやっているいくつかの他の閉鎖的な方法が欠けていたと思って、stacktraceは非常に明るく見えませんでした(problem_151.cljの行0?本当に?) - とにかく、私は質問を更新しました。 – corvuscorax