sieve :: Int -> [Int] sieve max = sieve_l [2..max] (floor . sqrt . fromIntegral $ max) where sieve_l [n] _ = [n] sieve_l (n:xl) max_sqrt | n > max_sqrt = n:xl | otherwise = n : sieve_l (filter ((/= 0).(`mod` n)) xl) max_sqrt p10 :: Int p10 = sum $ sieve 2000000 main = putStrLn $ "Solution: " ++ show p10