Reputation: 1425
I have been learning Haskell over the last few days, through Learn You A Haskell. I've been attempting to complete some Project Euler problems, some of which require primes. However the function I have written to try to generate some (in this case primes below 20000) isn't outputting correctly. When I run it, GHCi
returns '[1, ' and seemingly doesn't terminate. The code I am using is:
sieve :: (Integral a) => a -> [a] -> [a]
sieve 20000 list = list
sieve n (x:xs) = sieve (n+1) $ x:(filter (\q -> q `mod` n /= 0) xs)
primesto20000 = sieve 2 [1..20000]
And then I am calling primesto20000
. I understand that the function may be inefficient, I am mainly asking for help on syntactic/process errors that I must have made.
Thankyou
Upvotes: 0
Views: 1431
Reputation: 63409
There are two problems in your code:
[1]
.n
you want to filter all numbers divisible by n
that are larger than n
. Without this condition, you filter n
itself, which has the result that you filter out all numbers.A corrected version could look like (with a parametrized limit):
limit :: Integral a => a
limit = 20000
sieve :: (Integral a) => a -> [a] -> [a]
sieve n list | n == limit
= list
sieve n (x:xs)
= sieve (n+1) $ x : (filter filt xs)
where
-- filter everything divisible by `n`, but not `n` itself.
filt q = (q <= n) || (q `mod` n /= 0)
primesto20000 = sieve 2 [1..limit]
Upvotes: 2
Reputation: 62858
You're filtering out multiples of every number, not just prime numbers. You want to check divisibility by x
, not by n
. (In fact, I'm not sure you need n
in the sieve
function at all; just make your primesto20000
function generate the appropriate input list, and pass that.)
Upvotes: 2