Сито Эратосфена в Haskell

Я решаю некоторые классические задачи на Haskell, чтобы разработать свой функционал. навыки, и у меня есть проблема с реализацией оптимизации, предложенной на этом сайте "Практика программирования" :

У меня есть три решения этой проблемы, и третье решение слишком медленное по сравнению со вторым решением. Может кто-нибудь предложить некоторые улучшения мой код?

Мои реализации:

-- primeira implementação
primes n
    | n < 2 = []
    | n == 2 = [2]
    | n `mod` 2 == 0 = primes'
    | otherwise = if (find (\x -> n `mod` x == 0) primes') == Nothing then
                      n:primes'
                  else
                      primes'
    where primes' = primes (n - 1)

-- segunda implementação
primes' :: Integer -> [Integer]
primes' n = sieve $ 2 : [3,5..n]
    where sieve :: [Integer] -> [Integer]
          sieve [] = []
          sieve l@(x:xs)
              | x*x >= n = l
              | otherwise = x : sieve list'
              where list' = filter (\y -> y `mod` x /= 0) xs

-- terceira implementação
primes'' :: Integer -> [Integer]
primes'' n = 2 : sieve 3 [3,5..n]
    where sieve :: Integer -> [Integer] -> [Integer]
          sieve _ [] = []
          sieve m l@(x:xs)
              | m*m >= n = l
              | x < m*m = x : sieve m xs
              | otherwise = sieve (m + 2) list'
              where list'= filter (\y -> y `mod` m /= 0) l

6
задан Will Ness 25 December 2018 в 10:40
поделиться