Многие действительно быстрые способы вычисления простых чисел в haskell описаны на странице haskellwiki для простых чисел .В частности, второй кажется достаточно хорошим, так что вы можете написать это так:
main = print . sum . takeWhile (< 2000000) $ primes
primes = 2: 3: sieve (tail primes) [5,7..]
sieve (p:ps) xs = h ++ sieve ps [x | x <- t, rem x p /= 0]
where (h,~(_:t)) = span (< p*p) xs
Запустив его, мы получим:
ghc --make -O2 Euler10.hs
time ./SOAns
142913828922
real 0m1.598s
user 0m1.577s
sys 0m0.017s
В вики описывается, почему ваше решение такое медленноеосновная причина в том, что для каждого числа до 2000000 устанавливается сито, когда достаточно одного для каждого простого числа.