Problem 10 is about primes again, and it's getting tedious. Thankfully the sieve from Problem 8 can be factored out into a separate module. Now we need to make a correction there - Integer instead of Int, as the numbers are getting large.
import Control.Monad import Data.Array.ST import Control.Monad.ST sieve n = runSTUArray $ do p <- newArray(2, n) True :: ST s (STUArray s Integer Bool) sequence_ [ readArray p i >>= flip when ( sequence_ [ writeArray p j False | j <- [2*i, 3*i .. n]] ) | i <- [2 .. maxdiv n] ] return p maxdiv = ceiling . sqrt . fromInteger . toInteger
And then:
module Euler0010 where import Data.Array.IArray import Primes euler0010 = sum $ map fst $ filter snd $ assocs $ sieve 2000000
Takes a while in interactive mode, about 20 sec. When compiled, however, takes 1.28 sec. It's OK.