packages feed

memo-sqlite-0.1: examples/fib.hs

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
-}