#!/bin/bash
if [ $# -lt 2 ]
then
echo "2 arguments needed."
exit
fi
mv $1 tmp
mv $2 $1
mv tmp $2
echo "Done!"
-- The naive fibonacci function fib :: Int -> Integer fib 0 = 1 fib 1 = 1 fib n = fib (n-1) + fib (n-2) -- Fast memoised fibonacci function memoised_fib :: Int -> Integer memoised_fib x = (map fib [0..]) !! x
-- Mapping from Indices to Fibonacci numbers fibs :: [Integer] fibs = map fib [0..] -- Fast memoised fibonacci function memoised_fib :: Int -> Integer memoised_fib x = fibs !! x
module Main where import qualified Data.Map as M(Map,empty,insert,lookup) import "monads-fd" Control.Monad.Trans(lift) import Control.Monad.Trans.State.Lazy(StateT(..)) -- Memoise arbitrary monadic computations by wrapping them inside a StateT Monad Transformer memoState :: (Ord k, Monad m) => (k -> m s) -> k -> StateT (M.Map k s) m s memoState f k = StateT $ \s -> case M.lookup k s of Nothing -> do z <- f k return (z, M.insert k z s) Just z -> return (z, s)
-- Our base monadic computation (IO) f :: Int -> IO String f x = do putStr "Get Value #" putStrLn $ show x putStr "writesomething>" s <- getLine return s -- Here's the IO monadic value (f) used in a memoised context -- First we wrap f inside StateT using memoState -- Then we chain it together using the usual monadic operations -- Note the use of Lift to perform actions in the IO monad fchain :: StateT (Stat Int String) IO String fchain = do s <- f' 0 lift $ putStrLn s s <- f' 1 lift $ putStrLn s s <- f' 0 lift $ putStrLn s s <- f' 1 lift $ putStrLn s s <- f' 2 lift $ putStrLn s return s where f' = memoState f -- The memoised computation fchain can now be run as a whole -- Thanks to memoisation, inspite of us invoking (f' 0) and (f' 1) twice, the user will be asked for their values only once. main :: IO () main = runStateT fchain $ M.empty