-- $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]