-- $Id: lists.ghc,v 1.1 2001/06/12 04:47:12 doug Exp $ -- http://www.bagley.org/~doug/shootout/ -- from Michal Gajda module Main(main) where import Prelude copy [] = [] copy (x:xs) = x:copy xs -- to be honest, in pure functional language the RIGHT -- thing is copy list = list, because it's not mutable anyway -- (and the price is paid when doing reverse or (++) anyway) -- `seq`s below force evaluation of isok1 and isok2 test :: Int -> Int test size = isok1 `seq` length l3 where single x = [x] l1 = [1..size] l2 = copy l1 -- Should be just: "l1" l3 = foldl (++) [] (map single l2) l2' = foldr (++) [] (map single l3) l1' = reverse l1 isok1 = head l1' == size isok2 = l1' == l2' main = do s <- getLine putStrLn . show . test . read $ s