Project Euler 10

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.