Изучая clojure, пытаясь создать ленивую бесконечную последовательность всех простых чисел.
Я знаю, что есть более эффективные алгоритмы; Я делаю следующее больше как POC / урок, чем как идеальное решение.
У меня есть функция, которая, учитывая последовательность простых чисел, сообщает мне, каково следующее простое число:
(next-prime [2 3 5]) ; result: 7
Поэтому моя ленивая последовательность должна передать себя этой функции, затем взять результат и добавить его к себе.
Моя первая попытка:
(def lazy-primes
(lazy-cat [2 3 5] (find-next-prime lazy-primes)))
.. что приводит к исключению IllegalArgumentException: не знаю, как создать ISeq из: java.lang.Integer
Моя вторая попытка:
(def lazy-primes
(lazy-cat [2 3 5] [(find-next-prime lazy-primes)]))
.., который дает мне [2 3 5 7], когда меня просят 10 элементов.
Попытка 3:
(def lazy-primes
(lazy-cat [2 3 5]
(conj lazy-primes (find-next-prime lazy-primes))))
(take 10 lazy-primes) ; result: (2 3 5 7 2 3 5 7 2 3)
Все они, похоже, должны работать (или, по крайней мере, должны работать, учитывая, что предыдущее не сработало). Почему я получаю фиктивный вывод для каждого случая?