
Hi all, I was wondering if someone has written a tracer/debugger that shows you how a given Haskell expression is evaluated, by generating all the intermediate states of the expression until it is in normal form? For instance, given the following code:
take' 0 xs = [] take' n (x:xs) = x : take' (n-1) xs exp = take' 2 [1,2,3,4,5,6]
the trace of 'exp' would generate something like this:
exp = take' 2 [1,2,3,4,5,6] exp = (\n (x:xs) -> x : take' (n-1) xs) 2 [1,2,3,4,5,6] exp = 1 : take' (2-1) [2,3,4,5,6] exp = 1 : take' 1 [2,3,4,5,6] exp = 1 : (\n (x:xs) -> x : take' (n-1) xs) 1 [2,3,4,5,6] exp = 1 : 2 : take' (1-1) [3,4,5,6] exp = 1 : 2 : take' 0 [3,4,5,6] exp = 1 : 2 : (\0 xs -> []) 0 [3,4,5,6] exp = 1 : 2 : [] exp = [1,2]
That is, all the substitutions performed when evaluating 'exp' from left to right. I was thinking that something like this could be rather useful when teaching or learning Haskell. Thanks, Ulrik