From: panne Date: Thu, 29 Jun 2000 19:47:50 +0000 (+0000) Subject: [project @ 2000-06-29 19:47:50 by panne] X-Git-Tag: Approximately_9120_patches~4113 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=26d2e6391d331d985427131429734cb2e1d49366;p=ghc-hetmet.git [project @ 2000-06-29 19:47:50 by panne] There is not much point in memoising Integers, so we should better use unary "numbers" (i.e. lists of units) instead --- diff --git a/ghc/tests/lib/should_run/memo002.hs b/ghc/tests/lib/should_run/memo002.hs index d441c0a..7ffa09a 100644 --- a/ghc/tests/lib/should_run/memo002.hs +++ b/ghc/tests/lib/should_run/memo002.hs @@ -1,9 +1,10 @@ -module Main -where +module Main where -import Memo -import System(getArgs) +import Memo ( memo ) +import List ( genericLength, genericReplicate ) +import System ( 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 @@ -11,13 +12,17 @@ main = do (arg:_) <- getArgs print mfi putStrLn "" +-- There is not much point in memoising Integers, so we use unary "numbers" instead mfib :: Integer -> Integer -mfib = memo ufib +mfib = genericLength . mfib' . flip genericReplicate () -ufib :: Integer -> Integer -ufib 0 = 1 -ufib 1 = 1 -ufib n = mfib (n-1) + mfib (n-2) +mfib' :: [()] -> [()] +mfib' = memo ufib + +ufib :: [()] -> [()] +ufib [] = [()] +ufib [()] = [()] +ufib (():n1@(():n2)) = mfib' n1 ++ mfib' n2 fib :: Integer -> Integer fib 0 = 1