summaryrefslogtreecommitdiff
path: root/testsuite/tests/lib/should_run/memo002.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/lib/should_run/memo002.hs')
-rw-r--r--testsuite/tests/lib/should_run/memo002.hs30
1 files changed, 30 insertions, 0 deletions
diff --git a/testsuite/tests/lib/should_run/memo002.hs b/testsuite/tests/lib/should_run/memo002.hs
new file mode 100644
index 0000000000..aa0a1d27c9
--- /dev/null
+++ b/testsuite/tests/lib/should_run/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)