2

的篩非詳盡的模式我想使用埃拉托色尼的篩的這段代碼從該頁面:http://en.literateprograms.org/Sieve_of_Eratosthenes_(Haskell)#chunk DEF:primes_naive哈斯克爾:與埃拉托色尼

只有一點修改,所以它只顯示了素數高達數:

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 

我知道,從遞歸函數,其中,例如案件英里此錯誤但是這裏缺少什麼?

+1

儘管配方看起來像Eratosthenes的篩網,但評估實際上是不同的並且非常慢。您可能對[本文]感興趣(https://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf)。 –

+0

將其更改爲「sieve(p:xs)|」 p * p <= m = p:sieve [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]