Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Control.Monad
- import Control.Monad.ST
- import Data.STRef
- import System.Environment (getArgs)
- main :: IO ()
- main = do
- n <- fmap (read . head) $ getArgs
- putStrLn . show $ f n
- f :: Int -> Integer
- f n = runST $ do
- first <- newSTRef 0
- second <- newSTRef 1
- loop n first second
- readSTRef second
- loop n first second =
- if n == 0
- then
- return ()
- else do
- oldFirst <- readSTRef first
- oldSecond <- readSTRef second
- writeSTRef second $! oldFirst + oldSecond
- writeSTRef first oldSecond
- loop (n-1) first second
- -- $ time ./ex2 1000000
- -- real 0m3.760s
- -- user 0m3.659s
- -- sys 0m0.071s
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement