Почему этот основной тест такой медленный?

Этот код был взят из книги "Haskell Road to Logic, Math and Programming". Он реализует алгоритм решета Эратосфена и решает задачу проекта Эйлера 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

На самом деле он работает даже медленнее, чем наивный прайм-тест. Кто-нибудь может объяснить такое поведение?

Я подозреваю, что это как-то связано с повторением каждого элемента в списке в функции отметки.

Спасибо.

10
задан Zero Piraeus 22 January 2015 в 18:44
поделиться