Ralf Welter developed a method which enables memoisation and caching even for non-strict functional languages like Haskell without making this memoised functions strict or using only weak pointer comparisions to compare possibly unevaluated arguments. Basically, strictness information of functional closures is recorded at runtime and used to change the evaluation strategy to call-by-value and table lookup in case of repeated evaluation.
Ralf Welter implemented a simulation of the spineless tagless graphreduction machine (STG), which may be of interest in itself, and extended it by his memoisation/caching method.