Portability | portable |
---|---|
Stability | unstable |
Maintainer | claudiusmaximus@goto10.org |
Memoize functions in a SQLite3 database.
The functions memoized while having type f :: k -> IO v
must result in
the same output given the same input, otherwise all kinds of wrongness
will result.
The cleanup
action returned by the memoizers must not be called if you
are going to use the memoized function again; beware.
An example program (included in the examples directory) might look like:
-- fib.hs import Data.Memo.Sqlite (memoRec', readShow, table) import Control.Monad (liftM2) import System.Environment (getArgs) 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)) 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 >>= \nth -> putStrLn $ "fib(" ++ show n ++ ") = " ++ show nth cleanup
Example usage:
ghc --make fib.hs ./fib fibs.sqlite3 fibs 10 ./fib fibs.sqlite3 fibs 10 ./fib fibs.sqlite3 fibs 100 ./fib fibs.sqlite3 fibs 100
See also:
- the
data-memocombinators
package for pure in-memory memoization.
- data Table
- table :: String -> Maybe Table
- class Sqlite t where
- toSqlite :: t -> SQLData
- fromSqlite :: SQLData -> t
- type Wrap s t k v = (k -> IO v) -> s k -> IO (t v)
- type Unwrap s t k v = (s k -> IO (t v)) -> k -> IO v
- type Wrapper s t k v = (Wrap s t k v, Unwrap s t k v)
- data ReadShow t
- readShow :: Wrapper ReadShow ReadShow k v
- type Memo k v = (k -> IO v) -> IO (IO (), k -> IO v)
- type MemoRec k v = ((k -> IO v) -> k -> IO v) -> IO (IO (), k -> IO v)
- type MkMemo k v = FilePath -> Table -> Memo k v
- type MkMemoRec k v = FilePath -> Table -> MemoRec k v
- memo :: (Sqlite k, Sqlite v) => MkMemo k v
- memoRec :: (Sqlite k, Sqlite v) => MkMemoRec k v
- memo' :: (Sqlite (s k), Sqlite (t v)) => Wrapper s t k v -> MkMemo k v
- memoRec' :: (Sqlite (s k), Sqlite (t v)) => Wrapper s t k v -> MkMemoRec k v
- data SQLData
- = SQLInteger Int64
- | SQLFloat Double
- | SQLText String
- | SQLBlob ByteString
- | SQLNull
Database table identifier.
Database (de)serialization.
Database (de)serialization
Wrapper types for control over (de)serialization.
Read/Show (de)serialization.
Use Read and Show for database (de)serialization.
readShow :: Wrapper ReadShow ReadShow k vSource
Wrapper using Read and Show for (de)serialization of both keys and values.
Memoizers.
Memoizer types.
Memoizer functions.
memoRec :: (Sqlite k, Sqlite v) => MkMemoRec k vSource
Memoize a recursive function using an SQLite3 database.
memo' :: (Sqlite (s k), Sqlite (t v)) => Wrapper s t k v -> MkMemo k vSource
Memoize a function using an SQLite3 database, using the supplied wrapper for control of (de)serialization.
memoRec' :: (Sqlite (s k), Sqlite (t v)) => Wrapper s t k v -> MkMemoRec k vSource
Memoize a recursive function using an SQLite3 database, using the supplied wrapper for control of (de)serialization.