gpt4 book ai didi

java - 使用 cons 在 Clojure 中收集对

转载 作者:搜寻专家 更新时间:2023-10-31 19:55:27 25 4
gpt4 key购买 nike

我在 Clojure 中基于 Eratosthenes 筛法编写了一个 Sieve 类型的函数......并遇到了对列表的错误:ClassCastException clojure.lang.Cons cannot be cast to java.lang.Number clojure。 lang.Numbers.remainder (Numbers.java:171)


(defn mark-true [n]
(cons n '(true)))

(defn unmarked? [ns]
(not (list? ns)))

(defn divides? [m n]
(if (= (mod n m) 0)
true
false ))

(defn mark-divisors [n ns]
(cond
(empty? ns) '()
(and (unmarked? (first ns)) (divides? n (first ns)))
(cons (cons (first ns) '(false)) (mark-divisors n (rest ns)))
:else (cons (first ns) (mark-divisors n (rest ns)))))

(defn eratosthenes [ns]
(cond
(empty? ns) '()
(unmarked? (first ns))
(cons (mark-true (first ns))
(eratosthenes (mark-divisors (first ns) (rest ns))))
:else (cons (first ns) (eratosthenes (rest ns)))))

;(eratosthenes (list 2 3 4 5 6))
;=> ClassCastException clojure.lang.Cons cannot be cast to java.lang.Number  clojure.lang.Numbers.remainder (Numbers.java:171)

但是,更改标记样式,放弃 cons 并改用 conj 或 vector 对,都解决了错误。

我仍然在寻找错误的一个很好的解释....

最佳答案

问题是 list? 在使用 cons 构建的序列上检查失败,如下所示:

(list? (conj () 1)) ;=> true
(list? (cons 1 ())) ; => false

您可以将对 list? 的调用切换为对 seq? 的调用,它应该可以工作。

有关为什么会这样的详细信息,我建议阅读此答案:Clojure: cons(seq) vs. conj(list)

关于java - 使用 cons 在 Clojure 中收集对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21318858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com