The Traced module provides a simple way of tracing expression evaluation.
A value of type Traced a has both a value of type a and an expression tree
that describes how the value was computed.

There are instances for the Traced type for all numeric classes to make
it simple to trace numeric expressions.

The expression tree associated with a traced value is exactly that: a tree.
But evaluation of expressions in Haskell typically has sharing to avoid recomputation.
This sharing can be recovered by the (impure) reShare function.