[Haskell-cafe] Retaining functions in memory

Ryan Ingram ryani.spam at gmail.com
Thu Jul 28 04:05:59 CEST 2011


Use memoization.  Here's an example:

cabal-install MemoTrie


import Data.MemoTrie

fib_fix :: (Integer -> Integer) -> Integer -> Integer
fib_fix _ n | n < 0 = error "invalid input"
fib_fix _ 0 = 1
fib_fix _ 1 = 1
fib_fix rec n = rec (n-1) + rec (n-2)

-- 'tie the knot' on a recusrive function
func_fix :: ((a -> b) -> (a -> b)) -> (a -> b)
func_fix f = let rec = f rec in rec

-- memoized knot tying; 'memo' stops us from recomputing the same value more
than once.
memo_fix :: HasTrie a => ((a -> b) -> (a -> b)) -> (a -> b)
memo_fix f = let rec = memo (f rec) in rec

-- try comparing the performance of these two on large arguments
fib_slow, fib_fast :: Integer -> Integer
fib_slow = func_fix fib_fix
fib_fast = memo_fix fib_fix


On Tue, Jul 26, 2011 at 2:53 AM, Siddhartha Gadgil <
siddhartha.gadgil at gmail.com> wrote:

>       I have been making programs for mathematical applications
> (low-dimensional topology) in Haskell, which I find a delight to code
> in. However, the execution is slow, and this seems to be because
> recursively defined functions seem to be recomputed. For example
> f(100) needs f(15) which needs f(7) ... The dependencies are not
> obvious to the compiler.
>       I was looking for a way to retain the values of a specific
> function in memory. Is there some way to do this.
>                                         Thanks,
>                                         Siddhartha
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20110727/e44fb86d/attachment.htm>


More information about the Haskell-Cafe mailing list