Why do I need a monad for IO in Haskell? The standard explanation is, that the IO monad hides the non-functional IO actions ―which do have side effects― from the functional world of Haskell. But how does this "hiding" work, apart from having IO actions disappearing beyond the borders of my knowledge?
This report scratches the surface of category theory, an abstract branch of algebra, just deep enough to find the monad structure. On the way we discuss the relations to the purely functional programming language Haskell. Finally it should become clear how the IO monad keeps Haskell pure.
This guide tries to fit exactly between the available theoretical literature about category theory on the one side and literature about how to program with monads on the other.