Я надеюсь, что вы используете ghc -O2, а не ghci, верно? Ваша проблема будет в поколении, а не в суммировании.
Одним из более быстрых способов является использование потоковых последовательностей на основе слияния, которые лучше оптимизируются. С обычными списками:
import Data.List
import qualified Data.Map as M
primes :: [Integer]
primes = mkPrimes 2 M.empty
where
mkPrimes n m = case (M.null m, M.findMin m) of
(False, (n', skips)) | n == n' ->
mkPrimes (succ n) (addSkips n (M.deleteMin m) skips)
_ -> n : mkPrimes (succ n) (addSkip n m n)
addSkip n m s = M.alter (Just . maybe [s] (s:)) (n+s) m
addSkips = foldl' . addSkip
-- fuse:
main = print (sum (takeWhile (<= 2000000) primes))
Получим,
$ ghc -O2 --make A.hs
$ time ./A
142913828922
./A 9.99s user 0.17s system 99% cpu 10.166 total
Переключение на потоки, поэтому сумма. взять предохранители:
import qualified Data.List.Stream as S
main = print (S.sum (S.takeWhile (<= 2000000) primes))
Экономит немного времени,
$ time ./A
142913828922
./A 9.60s user 0.13s system 99% cpu 9.795 total
Но ваша проблема будет в генерации простых чисел, как мы видим, если мы отбросим суммирование вообще, заменив сумму на последнюю:
$ time ./A
1999993
./A 9.65s user 0.12s system 99% cpu 9.768 total
Так что найдите лучший основной генератор. : -)
Наконец, в Hackage есть библиотека для быстрых простых генераторов:
http://hackage.haskell.org/packages/archive/primes/0.1.1/doc/html/Data-Numbers-Primes.html
Используя его, наше время становится:
$ cabal install primes
$ cabal install stream-fusion
$ cat A.hs
import qualified Data.List.Stream as S
import Data.Numbers.Primes
main = print . S.sum . S.takeWhile (<= 2000000) $ primes
$ ghc -O2 -fvia-C -optc-O3 A.hs --make
$ time ./A
142913828922
./A 0.62s user 0.07s system 99% cpu 0.694 total