primes :: [Int] primes = sieve [2..] sieve :: [Int] -> [Int] sieve (p:xs) = p : sieve [x | x <- xs, x `mod` p /= 0] twin_primes :: Int -> [(Int,Int)] twin_primes k = [(p,q) | (p,q) <- zip primes (tail primes), q == p+2*k]