diff options
Diffstat (limited to 'libraries/base/tests/memo002.hs')
-rw-r--r-- | libraries/base/tests/memo002.hs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/libraries/base/tests/memo002.hs b/libraries/base/tests/memo002.hs new file mode 100644 index 0000000000..aa0a1d27c9 --- /dev/null +++ b/libraries/base/tests/memo002.hs @@ -0,0 +1,30 @@ +module Main where + +import Memo2 ( memo ) +import Data.List ( genericLength, genericReplicate ) +import System.Environment ( getArgs ) + +main :: IO () +main = do (arg:_) <- getArgs + mapM_ printTriple [ (i,fib i,mfib i) | i <- [10..read arg] ] + where printTriple (i,fi,mfi) = do print i + print fi + print mfi + putStrLn "" + +-- There is not much point in memoising Integers, so we use unary "numbers" instead +mfib :: Integer -> Integer +mfib = genericLength . mfib' . flip genericReplicate () + +mfib' :: [()] -> [()] +mfib' = memo ufib + +ufib :: [()] -> [()] +ufib [] = [()] +ufib [()] = [()] +ufib (():n1@(():n2)) = mfib' n1 ++ mfib' n2 + +fib :: Integer -> Integer +fib 0 = 1 +fib 1 = 1 +fib n = fib (n-1) + fib (n-2) |