| 1 | {-# LANGUAGE ExistentialQuantification #-} |
|---|
| 2 | |
|---|
| 3 | import Data.Typeable |
|---|
| 4 | import Data.Maybe |
|---|
| 5 | import System.CPUTime |
|---|
| 6 | import System.Environment |
|---|
| 7 | import Unsafe.Coerce |
|---|
| 8 | |
|---|
| 9 | data Any = forall a. (Typeable a) => Any a |
|---|
| 10 | |
|---|
| 11 | sum1 :: [Any] -> Int |
|---|
| 12 | sum1 [] = 0 |
|---|
| 13 | sum1 (Any x:xs) = (fromJust (cast x) :: Int) + sum1 xs |
|---|
| 14 | |
|---|
| 15 | sum2 :: [Any] -> Int |
|---|
| 16 | sum2 [] = 0 |
|---|
| 17 | sum2 (Any x:xs) = head (fromJust (cast x) :: [Int]) + sum2 xs |
|---|
| 18 | |
|---|
| 19 | sum3 :: [Any] -> Int |
|---|
| 20 | sum3 [] = 0 |
|---|
| 21 | sum3 (Any x:xs) = head (unsafeCoerce x :: [Int]) + sum3 xs |
|---|
| 22 | |
|---|
| 23 | doTime x = do |
|---|
| 24 | start <- getCPUTime |
|---|
| 25 | putStr "Result: " |
|---|
| 26 | print x |
|---|
| 27 | stop <- getCPUTime |
|---|
| 28 | putStr "Time(sec): " |
|---|
| 29 | print (fromIntegral (stop - start) / 1e12) |
|---|
| 30 | |
|---|
| 31 | main = do |
|---|
| 32 | [len] <- getArgs |
|---|
| 33 | let list = [1..read len::Int] |
|---|
| 34 | putStrLn "sum1" |
|---|
| 35 | let x = map Any list |
|---|
| 36 | doTime $ sum1 x |
|---|
| 37 | doTime $ sum1 x |
|---|
| 38 | doTime $ sum1 x |
|---|
| 39 | putStrLn "" |
|---|
| 40 | putStrLn "sum2" |
|---|
| 41 | let x = map (Any . (:[])) list |
|---|
| 42 | doTime $ sum2 x |
|---|
| 43 | doTime $ sum2 x |
|---|
| 44 | doTime $ sum2 x |
|---|
| 45 | putStrLn "" |
|---|
| 46 | putStrLn "sum3" |
|---|
| 47 | let x = map (Any . (:[])) list |
|---|
| 48 | doTime $ sum3 x |
|---|
| 49 | doTime $ sum3 x |
|---|
| 50 | doTime $ sum3 x |
|---|