2008/10/07
Project Euler: Problem 10
純粋にやると遅延評価のやりすぎによる stack over flow となった。seq を用いて遅延評価を回避している。
しかしこういう答えだと、純粋に和を求めなくともうまい方法があるのではと思ってしまう。いやたぶんあるんだろう。確信はないけど。
参考: sum の stack overflow - haskell のある暮らし
実行結果
$ runhaskell 10.hs
1000000000001
プログラム
1 primes = sieve [2..]
2 where sieve (p:ps) = p : [x | x <- ps, x `mod` p /= 0]
3
4 f = strictSum 0 $ takeWhile (<= 2000000) $ primes
5 where strictSum r [] = r
6 strictSum r (x:xs) = let r' = r+x
7 in r' `seq` strictSum r' xs
8
9 main = print $ f