如何遍历Clojure中的生产者函数生成的树?

如何遍历Clojure中的生产者函数生成的树?,clojure,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

以下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))
根据
: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不能转换为java.lang.number

那么,关于如何编写
所有路径
函数有什么想法吗

更新:Stacktrace---------------------

(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
真正的问题出现在第9行:
调用需要一个数字,但得到一个序列

它似乎在查看
sheets
键的一些编号元素,那么
sheets
如何成为一个惰性序列呢?你在序列上映射
+
,然后转换成向量,对吗

不,那不是你正在做的。这就是
vector
vec
之间的区别:

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
的向量,而
(vector-foo)
返回一个单元素向量,包含
foo
本身作为一个元素。

堆栈跟踪或者我们只是猜测。@amalloy-我以为我缺少了其他的克隆方法,stacktrace似乎不是很有启发性(problem_151.clj?真的吗?)的第0行,但无论如何,我已经更新了这个问题。哎呀:-)我猜是因为n00bness过多。非常感谢@corvus只是一个stacktraces是多么有用的演示-仅仅盯着代码看几分钟并没有发现任何明显的东西,但是使用stacktrace几秒钟就可以找到正确的行,以便更深入地查看。只要有可能,包括带有问题描述的stacktrace。
user> (let [xs [1 2 3 4] ys (repeat 10)]
        ((juxt vec vector) (map + xs)))
[[1 2 3 4] [(1 2 3 4)]]