haskell - Sieve gets stuck at the beginning -


i wrote following sieve:

isprime :: integer -> [integer] -> bool isprime n = (\i -> n `mod` /= 0)   sieve :: [integer] sieve = 2 : [i | <- [3,5..], isprime sieve] 

but don't understand why gets stuck after first value. running take 10 sieve results in [2, , nothing happens. has infinite recursion. may problem sieve growing , @ same time it's used inside isprime? reason tried modifying isprime follows, without success:

isprime :: integer -> [integer] -> bool isprime n = (\i -> n `mod` /= 0) . takewhile (<n) 

edit: surprisingly, @jubobs's modification works:

isprime :: integer -> [integer] -> bool isprime n = (\i -> n `mod` /= 0) . takewhile (\p -> p^2 <= n) 

i cannot understand why version of takewhile works while other not. see previous version tested many unnecessary divisors, in finite number nontheless.


the code should equivalent following python code:

def is_prime(n, ps):     in ps:         if n % == 0: return false     return true   def sieve():     yield 2     n = 3     ps = [2]     while true:         if is_prime(n, ps):             yield n             ps.append(n)         n += 2 

you cause infinite recursion applying all entire sieve , not values sieved far. i.e. second element, isprime tests all values in sieve instead of 2.

in python version, wrote

is_prime(n, ps) 

which tests n against numbers sieved far. python equivalent of did in haskell basically

is_prime(n, sieve()) 

now, using takewhile (<n) won't because requires calculating sieve elements. imagine happens second element of sieve (which should 3): tests values of sieve < 3 holds, in order test need evaluate sieve elements. still have infinite recursion.


Comments

Popular posts from this blog

toolbar - How to add link to user registration inside toobar in admin joomla 3 custom component -

linux - disk space limitation when creating war file -

How to provide Authorization & Authentication using Asp.net, C#? -