-- $Id: sieve.ghc,v 1.4 2001/07/26 13:16:43 doug Exp $ -- http://www.bagley.org/~doug/shootout/ -- from Roland Dowdeswell module Main where import System(getArgs) main = getArgs >>= putStrLn . ("Count: "++) . show . mytest . read . headOr1 where headOr1 x = if length x /= 1 then "1" else head x -- here we try to force it to recompute at each step. Note -- that we are not naming `sieve [2..8192]' and we are forcing -- a comparison with -1. Of course there is still no guarantee -- that any particular Haskell implementation will actually -- recompute the value. mytest :: Int -> Int mytest 1 = length (sieve [2..8192]) mytest n | length (sieve [2..8192]) == -1 = error "doh" | otherwise = mytest (n-1) -- we use Int rather than let Haskell default to Integer, -- because we are trying to remain competetive with other -- languages that do not do arbitrary precision math by -- default... sieve :: [Int] -> [Int] sieve [] = [] sieve (h:t) = h : sieve [x| x<-t, x`mod`h /= 0]