I’m trying to find all the primes less than some integer n as concisely as possible, using list comprehensions. I’m learning Haskell, and this is just an exercise. I’d like to write something like:
isqrt :: Integral a => a -> a
isqrt = floor . sqrt . fromIntegral
primes :: Integral a => a -> [a]
primes n = [i | i <- [1,3..n], mod i k /= 0 | k <- primes (isqrt i)]
which of course doesn’t work. Is there a way to have a list comprehension inside a list comprehension?
Here is the error I’m getting:
exercise-99-1.hs:138:39: Not in scope: `k'
exercise-99-1.hs:138:46:
Illegal parallel list comprehension: use -XParallelListComp
exercise-99-1.hs:138:68: Not in scope: `i'
BUT – I wasn’t really expecting the syntax to even be legit 🙂
The intent was to translate as directly as possible: ” primes n = the set of odd integers i less than n such that i is not divisible by any k, for all k in the set: primes (isqrt i)“ – more or less. (I hope I got that right?)
Thanks!
I made some progress with the following:
Is there a shorter way to write the lambda predicate?
edit: Yes, there is, thanks to the remarks in the comments!