-- credit: https://ideone.com/e81 module OthersPrimeNumber ( primesTME ) where primesTME :: [Int] primesTME = 2 : ([3,5..] `minus` foldt [ [p*p,p*p+2*p..] | p <- primes_ ]) where primes_ = 3 : ([5,7..] `minus` foldt [ [p*p,p*p+2*p..] | p <- primes_ ]) foldt ~((x:xs):t) = x : union xs (foldt (pairs t)) pairs ~((x:xs):ys:t) = (x : union xs ys) : pairs t minus :: [Int] -> [Int] -> [Int] minus xs@(x:xt) ys@(y:yt) = case compare x y of LT -> x : minus xt ys EQ -> minus xt yt GT -> minus xs yt minus a b = a union :: [Int] -> [Int] -> [Int] union xs@(x:xt) ys@(y:yt) = case compare x y of LT -> x : union xt ys EQ -> x : union xt yt GT -> y : union xs yt