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 <
[email protected]> 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
> [email protected]
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to