Я написал функцию типа Сита в Clojure на основе Sieve of Eratosthenes ..... и наткнулся на ошибку со списками пар: ClassCastException clojure.lang.Cons нельзя отбросить java.lang.Number clojure.lang.Numbers.remainder (Numbers.java:171)Коллекция пар в Clojure с использованием минусов
(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)
Однако изменение маркировки стиля, отказ от недостатков и использования Призывание или векторных пар вместо этого, оба solv ошибка.
Еще я ищу хорошее объяснение ошибки ....
Вы не можете ожидать ответа, если вы не размещаете всю соответствующий код. Там нет остаточного звонка ... ясно, что 'mark-divisors' отсутствует. –
Вы правы - thaks – FredAKA
в какой-то момент делит? функция получает 3 и (4 ложных) аргумента. Второй аргумент arg не может быть добавлен к номеру – edbond