clojure - LazySeq 不能转换为 Number

标签 clojure

我正在尝试实现一个返回伯努利数的函数:

(defn binom [N K]
    (if (or (= K 0) (= N K)) 
        (int 1)
        (int (+ (binom (- N 1) (- K 1))
                (binom (- N 1) K)))))

(defn bernoulli [M]
    (if (= M 0)
        (int 1)
        (for [K (range 0 (- M 1))] 
            (* (binom M K)
               (bernoulli K)))))

(println (bernoulli 5))

(显然它还没有正确实现,但这与我的问题无关)

当我运行这个程序时,我得到异常 java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to java.lang.Number

但是,如果我将递归调用 (bernoulli K) 替换为 (bernoulli 0),代码运行正常。

这是怎么回事?为什么我的 binom 函数可以将 K 作为数字处理,但我的 bernoulli 函数不能?

这是完整的错误信息:

$ clojure bern.clj
(Exception in thread "main" java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to java.lang.Number
    at clojure.lang.Numbers.multiply(Numbers.java:146)
    at user$bernoulli$iter__3__7$fn__8$fn__9.invoke(x2.clj:21)
    at user$bernoulli$iter__3__7$fn__8.invoke(x2.clj:18)
    at clojure.lang.LazySeq.sval(LazySeq.java:42)
    at clojure.lang.LazySeq.seq(LazySeq.java:60)
    at clojure.lang.RT.seq(RT.java:473)
    at clojure.core$seq.invoke(core.clj:133)
    at clojure.core$print_sequential.invoke(core_print.clj:46)
    at clojure.core$fn__5270.invoke(core_print.clj:140)
    at clojure.lang.MultiFn.invoke(MultiFn.java:167)
    at clojure.core$pr_on.invoke(core.clj:3266)
    at clojure.core$pr.invoke(core.clj:3278)
    at clojure.lang.AFn.applyToHelper(AFn.java:161)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:601)
    at clojure.core$prn.doInvoke(core.clj:3311)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invoke(core.clj:601)
    at clojure.core$println.doInvoke(core.clj:3331)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at user$eval18.invoke(x2.clj:29)
    at clojure.lang.Compiler.eval(Compiler.java:6514)
    at clojure.lang.Compiler.load(Compiler.java:6955)
    at clojure.lang.Compiler.loadFile(Compiler.java:6915)
    at clojure.main$load_script.invoke(main.clj:283)
    at clojure.main$script_opt.invoke(main.clj:343)
    at clojure.main$main.doInvoke(main.clj:427)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.lang.Var.invoke(Var.java:415)
    at clojure.lang.AFn.applyToHelper(AFn.java:161)
    at clojure.lang.Var.applyTo(Var.java:532)
    at clojure.main.main(main.java:37)

最佳答案

bernoulli 中的第二个条件是对 for 的调用,它返回一个惰性序列,但您正试图对其调用一个算术运算,这很简单无效的。也许您想用 (apply + (for ...)) 对结果求和,它使用 for 返回的值作为 + 的参数>(我不知 Prop 体的算法,也许你想要平均值或乘积而不是总和...)。

关于clojure - LazySeq 不能转换为 Number,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37101252/

相关文章:

macros - Clojure 宏总是泄漏吗?

clojure - 如何运行对同一个集合进行操作的多个函数,但只遍历集合一次? (clojure,包括示例)

clojure - 构建一个懒惰的,不纯的id生成器

clojure - 选择满足clojure中给定谓词的集合的第一项

clojure - 如何将Java字符串转换为EDN对象?

clojure - 有没有办法简化 map 中的 map ?

clojure - 为什么 Java 会提示找不到命名空间?

clojure - 记录构造函数和位置工厂函数之间的区别

clojure - 在 Clojure 中进行单元测试时,如何避免手动评估 defrecords 和 defprotocols?

Clojure:如何从 jar 运行我的 main?