This document discusses functional programming principles and how to deal with effects like mutability, exceptions, and logging in a pure functional style. It introduces the idea of effects, distinguishing them from side effects. Six common effects are discussed: partiality, nondeterminism, dependency injection, logging, mutability, and exceptions. The document explains how the Kleisli category and monads can be used to define functions with effects and allow their composition while preserving referential transparency. This provides techniques for handling effects normally found in imperative programs using functional programming.