2011-08-06 3 views
2

다음 Clojure의 코드 트리를 생성하고 그것을 통과하려고 :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의 서열 반환 - :sheets 벡터 아닌 0 값의 수에 따라 4지도.

(defn all-paths [root] 
    (lazy-seq (cons root 
       (for [c (children-of root)] 
       (all-paths c))))) 

하지만이 java.lang.ClassCastException s의 수는 clojure.lang.LazySeq cannot be cast to java.lang.Number 것을 말해 오류 : all-paths 함수를 작성에서

내 첫 번째 시도는이이었다.

그래서, 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은 게으른 시퀀스가되는 이유는 무엇입니까? 시퀀스에 +을 매핑하면 벡터로 변환됩니다. 맞습니까?

아니, 그게 네가 하는게 아니야. (vector foo)는 소자 자체를 foo을 함유 한 요소 벡터를 리턴하면서

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

(vec foo)foo의 벡터 표시를 리턴 즉 vectorvec 차이이다.

+0

죄송합니다 .-) 과도한 n00bness에서 오는 것 같습니다. 고마워요! – corvuscorax

+1

@corvus 스택 트레이스가 얼마나 유용한 지 보여주는 데모 - 코드를 쳐다 본 몇 분 만에 아무 것도 분명히 알 수는 없지만 스택 트레이스를 사용하면 몇 초 만에 더 자세히 살펴볼 수 있습니다. 가능한 경우 문제 설명이있는 스택 추적을 포함하십시오. – amalloy

관련 문제