This doesn't directly solve your problem, but you may want to take a look at zoom-cache [1]. I've never used it myself, but it seems pretty nice. Cheers, [1] http://hackage.haskell.org/package/zoom-cache -- Felipe.