import Data.Function.ArrayMemoize -- Example: -- Fibonacci (pre-fixed point) fib' :: (Int -> Int) -> Int -> Int fib' _ 0 = 1 fib' _ 1 = 1 fib' rec n = rec (n - 1) + rec (n - 2) -- Memoizes fib between 0 and 100 (after that it is a run-time error) fib :: Int -> Int fib = arrayMemoFix (0, 1000) fib' -- IO variant fibIO' :: (Int -> IO Int) -> Int -> IO Int fibIO' _ 0 = return 1 fibIO' _ 1 = return 1 fibIO' rec n = do a <- rec (n - 1) b <- rec (n - 2) return (a + b) fibIO :: Int -> IO Int fibIO = uarrayMemoFixIO (0,1000) fibIO' -- Manual fix versions fibA :: Int -> Int fibA 0 = 1 fibA 1 = 1 fibA n = fibB (n - 1) + fibB (n - 2) fibB = arrayMemo (0, 1000) fibA