[Haskell-cafe] function result caching
John Meacham
john at repetae.net
Thu Oct 12 23:40:44 EDT 2006
On Thu, Oct 12, 2006 at 04:01:14PM -0700, Carl Witty wrote:
> Instead of using an infinite list, you can use an infinite binary tree,
> with a cached result at every node. Construct a binary tree with the
> following property: Consider the path from the root to a node, where
> left branches are called "0" and right branches are called "1". This
> sequence of 0's and 1's is the binary expansion of the key whose cached
> value is stored at that node (with the least-significant-bit at the root
> of the tree). (Actually constructing this tree, and looking things up
> in it, is left as an exercise for the reader; but it isn't very hard.)
>
> This generalizes to any kind of key that can be uniquely serialized into
> bits; looking up the corresponding value then takes O(# of bits in the
> key) extra time and space, which is far better than the O(2^(# of bits
> in the key)) that an infinite list would use.
it is too bad IntSet and IntMap are strict in their subtrees, it would
have been nice to provide things like
infiniteMap :: (Int -> a) -> IntMap a
infiniteMap = ...
cachingSet :: (Int -> Bool) -> IntSet
cachingSet = ...
out of curiosity, why are IntMap and IntSet strict in their subtrees.
since their subtrees are not of CPR form, I would think the benefit
would not be that great and might even hurt in some situations... was
there testing of the 'lazy' version?
John
--
John Meacham - ⑆repetae.net⑆john⑈
More information about the Haskell-Cafe
mailing list