import Control.Monad (liftM2) import System.Environment (getArgs) import Data.Memo.Sqlite (memoRec', readShow, table) -- | Compute Fibonacci numbers. fib :: (Integer -> IO Integer) -> Integer -> IO Integer fib _fib' n@0 = print n >> return 0 fib _fib' n@1 = print n >> return 1 fib fib' n = print n >> liftM2 (+) (fib' (n - 1)) (fib' (n - 2)) -- | Example program. main :: IO () main = do [file, ts, ns] <- getArgs let Just t = table ts n = read ns (cleanup, fib') <- memoRec' readShow file t fib fib' n >>= \fn -> putStrLn $ "fib(" ++ show n ++ ") = " ++ show fn cleanup {- Example usage: $ ghc -O2 -Wall --make fib.hs $ ./fib fibs.sqlite3 fibs 10 $ ./fib fibs.sqlite3 fibs 10 $ ./fib fibs.sqlite3 fibs 100 $ ./fib fibs.sqlite3 fibs 100 -}