Type classes for creating memoized functions.
This module can be added to your project using Bower.
To work on this project, use pulp
:
$ pulp build
$ pulp test
The following Fibonacci function implementation is slow, because its call graph grows exponentially in the size of its argument:
let fibonacciSlow 0 = 0
fibonacciSlow 1 = 1
fibonacciSlow n = fibonacciSlow (n - 1) +
fibonacciSlow (n - 2)
The memoize
function can be used to improve the performance of this function, by tabulating intermediate results:
let fibonacciSlow 0 = 0
fibonacciSlow 1 = 1
fibonacciSlow n = fibonacci (n - 1) +
fibonacci (n - 2)
fibonacci = memoize $ \n -> fibonacciSlow n
Note that fibonacciSlow
has been modified to call the faster fibonacci
function.
The memoize
function can be applied whenever there is a Tabulate
instance for the function argument type. This library provides instances of the Tabulate
type class for common types, such as Maybe
, Either
and Tuple
.
- Slides: Elegant memoization by Conal Elliott - @conal