primes :: (Integral i) => [i]
primes = sieve [2..]
    where
        sieve (p:ps) = p : sieve [p' | p' <- ps, p' `mod` p /= 0]
primes :: (Integral i) => [i]
primes = sieve [2..]
    where
        sieve (p:ps) = p : sieve [p' | p' <- ps, p' `mod` p /= 0]
primes = sieve [2..]
    where
        sieve (p:ps) = p : sieve [p' | p' <- ps, p' `mod` p /= 0]