The stable-memo package

[Tags: library, mit]

Whereas most memo combinators memoize based on equality, stable-memo does it based on whether the exact same argument has been passed to the function before (that is, is the same argument in memory).

For motivation, here is an implementation of map that preserves sharing of the spine for cyclic lists. It should even be safe to use this on arbitrarily long, acyclic lists since as long as the garbage collector is chasing you, the size of the memo table should stay under control, too.

 map :: (a -> b) -> [a] -> [b]
 map f = go
   where go = memo map'
         map' []     = []
         map' (x:xs) = f x : go xs

This library is largely based on the implementation of memo found in "Stretching the storage manager: weak pointers and stable names in Haskell", from Simon Peyton Jones, Simon Marlow, and Conal Elliott (


Versions0.1.1, 0.1.2, 0.1.3, 0.2.0, 0.2.1, 0.2.2, 0.2.3, 0.2.4
Dependenciesbase (>=4.6 && <5), ghc-prim (==0.3.*), hashtables (>=1.0 && <1.2), tagged (>=0.4 && <0.8)
AuthorJake McArthur <>
MaintainerJake McArthur <>
Source repositoryhead: darcs get
this: darcs get --tag v0.2.4
UploadedThu May 8 11:29:38 UTC 2014 by JakeMcArthur
Downloads788 total (72 in last 30 days)
StatusDocs uploaded by user
Build status unknown [no reports yet]




Maintainers' corner

For package maintainers and hackage trustees