2011-08-06 11 views
2

以下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 
+0

スタックトレースか、私たちはちょうど推測しています。 – amalloy

+0

@amalloy - 私はそれをやっているいくつかの他の閉鎖的な方法が欠けていたと思って、stacktraceは非常に明るく見えませんでした(problem_151.cljの行0?本当に?) - とにかく、私は質問を更新しました。 – corvuscorax

答えて

3
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 

本当の問題は、9行目である:>呼び出しがあります数字を期待していますが、シーケンスを取得しています。

sheetsキーの番号付きの要素を調べているようですが、sheetsはどのようにレイジーシーケンスになりますか?シーケンスの上に+をマッピングしていて、ベクトルに変換していますよね?

いいえ、あなたがしていることではありません。すなわちvectorvecとの間の差は次のとおり

user> (let [xs [1 2 3 4] ys (repeat 10)] 
     ((juxt vec vector) (map + xs))) 
[[1 2 3 4] [(1 2 3 4)]] 

(vector foo)要素としてfoo自体を含む、1要素ベクトルを返しながら、fooのベクトル表現を返し(vec foo)であること。

+0

おっと:-)過度のn00bnessから来ると思います。どうもありがとう! – corvuscorax

+1

@corvusスタックトレースがどれほど有用かを実証するだけです。ちょうどコードを見ても何も明らかではありませんでしたが、スタックトレースでは数秒でもっと深く見ることができます。可能な限り、問題の説明付きのスタックトレースを含めてください。 – amalloy

関連する問題