This document discusses reasoning about laziness in Haskell. It explains that functions and data constructors don't evaluate their arguments until needed. This laziness allows separating producers and consumers efficiently. However, laziness can also cause problems like space leaks from unevaluated thunks. The document demonstrates techniques like using seq, bang patterns and strict data types to control evaluation order and avoid space leaks. It also discusses how to determine which arguments a function evaluates strictly.