Haskell does not do this. Haskell is lazy (computed results are shared), but Haskell does not memoize by default. To illustrate:
func y = let z = y + y
in (add 1 z) * (add 1 z)
in `func` the result of computing `y + y` is shared because it has been given a name: `z`. However, the result of `add 1 z` is _not_ given a name and therefore has to be computed twice. Because Haskell is pure, they will result return the same result, however the result is not saved.
This avoids needing to save the results of _all_ function calls.
This avoids needing to save the results of _all_ function calls.