Я пришел со следующей реализацией Sieve of Eratosthenes:
sieve :: (Integral a) => [a] -> [a]
sieve [] = []
sieve (p:ps) = p:[x | x <- sieve ps, (rem x p) /= 0]
primes :: (Integral a) => [a]
primes = sieve [2..100]
Вызов primes
из gchi
печатает:
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]
Добавление этапа оптимизации начала маркировки чисел с p2 sup>, я получил следующий код:
sieve :: (Integral a) => [a] -> [a]
sieve [] = []
sieve (p:ps) = p:[x | x <- sieve ps, x > p ^ 2, (rem x p) /= 0]
primes :: (Integral a) => [a]
primes = sieve [2..100]
Но он производит следующий вывод:
[2]
Я новичок в Haskell, поэтому мне трудно понять, почему добавление x > p ^ 2
приводит к такому результату.
Не могли бы вы указать на мою ошибку, объяснив, как Haskell вычисляет это выражение?
p^2
числа, но, как я узнал из ответов, это не работает. Спасибо за бумажную ссылку. - person higuaro   schedule 23.04.2015NumberSieves
. - person dfeuer   schedule 23.04.2015