Try Hat - Haskell Tracer . I just tried this with a simple program, and it's pretty cool. However, I am not on Windows, and I do not know how difficult it would be to run it. This is probably quite complicated, which is a shame, as it is cool and, in fact, what you want. If you run it, you can get something like this information from Hat:
main = {IO} teneven = [2,4,6,8,10] _foldr (\..) [1,2,3,4,5,6,7,8, ...] [] = [2,4,6,8,10] (\..) 1 [2,4,6,8,10] = [2,4,6,8,10] (\..) 2 [4,6,8,10] = [2,4,6,8,10] (\..) 3 [4,6,8,10] = [4,6,8,10] (\..) 4 [6,8,10] = [4,6,8,10] (\..) 5 [6,8,10] = [6,8,10] (\..) 6 [8,10] = [6,8,10] (\..) 7 [8,10] = [8,10] (\..) 8 [10] = [8,10] (\..) 9 [10] = [10] (\..) 10 [] = [10]
There is even lambda. In addition, if you want, Hat can track foldr calls and other internal calls; by default it does not.