Этот код был взят из книги "Haskell Road to Logic, Math and Programming". Он реализует сито алгоритма эратосфенов и решает проблему Project Euler 10.
sieve :: [Integer] -> [Integer]
sieve (0 : xs) = sieve xs
sieve (n : xs) = n : sieve (mark xs 1 n)
where
mark :: [Integer] -> Integer -> Integer -> [Integer]
mark (y:ys) k m | k == m = 0 : (mark ys 1 m)
| otherwise = y : (mark ys (k+1) m)
primes :: [Integer]
primes = sieve [2..]
-- Project Euler #10
main = print $ sum $ takeWhile (< 2000000) primes
На самом деле он работает еще медленнее, чем наивный первичный тест. Может ли кто-нибудь объяснить это поведение?
Я подозреваю, что он имеет какое-то отношение к итерации каждого элемента в списке в функции метки.
Спасибо.