2

Я хотел использовать этот код решета Эратосфена с этой страницы: http://en.literateprograms.org/Sieve_of_Eratosthenes_(Haskell)#chunk DEF: primes_naiveHaskell: неисчерпывающему модели с Решето Эратосфена

только немного изменен, поэтому он показывает только простые числа до числа :

primes :: Integral a => a -> [a] 
primes m = sieve [2..m] 
    where 
    sieve (p:xs) = p : sieve [x|x <- xs, x `mod` p > 0] 

Но в WinGHCi всегда ошибка приходит (пример 10):

primes 10 
[2,3,5,7*Main> *** Exception: eratosthenes.hs:4:5-55: Non-exhaustive patterns in function sieve 

Я знаю, что эта ошибка из рекурсивных функций, где, например, случаи ми ssing, но что здесь отсутствует?

+1

Хотя состав выглядит как сито Эратосфена, оценка на самом деле отличается и очень медленная. Вас может заинтересовать [эта статья] (https://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf). –

+0

измените его на '' сито (p: xs) | p * p <= m = p: сито [x | x <- xs, x 'mod' p> 0] | иначе = (p: xs) '' для исправления и огромного ускорения. –

ответ

5

В отличие от версии на веб-сайте, ваша функция будет в конечном итоге потреблять весь список, так что вам нужен шаблон, соответствующий для []

sieve [] = [] 
2

Как сказал zakyggaps, ваша версия оценивает функцию sieve с конечным списком [2..m] который в конечном итоге будет оценивать случай пустого списка.

Другим способом решения этой проблемы является использование функции takeWhile :: (a -> Bool) -> [a] -> [a] для оценки sieve [2..], пока вы не достигнете своего предела m.

primes :: Integral a => a -> [a] 
primes m = takeWhile (\p -> p <= m) $ sieve [2..] 
    where 
    sieve (p:xs) = p : sieve [x|x <- xs, x `mod` p > 0] 

 Смежные вопросы

  • Нет связанных вопросов^_^