Я пытаюсь найти все простые числа меньше некоторого целого числа n
как можно короче, используя понимание списка. Я изучаю Haskell, и это просто упражнение. Я хотел бы написать что-то вроде:
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)]
что конечно не работает. Есть ли способ иметь понимание списка внутри понимания списка?
Вот ошибка, которую я получаю:
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'
НО - я действительно не ожидал, что синтаксис будет даже законным :-)
Намерение состояло в том, чтобы перевести как можно более прямо: " primes n
= набор нечетных целых чисел i
меньше n
, таких что i
не делится ни на одно k
, для всех k
в наборе: primes (isqrt i)
" - больше или менее. (Надеюсь, я правильно понял?)
Спасибо!
[n | n<-[2..545], []<-[[j | i<-[2..n-2], j<-[i*i,i*i+i..n], j==n]]]
- как пробное деление, так и своего рода сито Эратосфена. - person Will Ness   schedule 31.07.2016