, 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
, . takeWhile :
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
$ time ./A
142913828922
./A 0.62s user 0.07s system 99% cpu 0.694 total