Monads are a typeclass for defining imperative languages. The monad typeclass allows for sequencing of operations through flatMap and lifting of values using point. For the IO monad, flatMap sequences IO operations while point lifts values into the IO context. This allows imperative-style code to be written in a pure functional style. An interpreter is then used to actually execute the side effects by pattern matching on the IO data type. With a Monad instance defined for IO using flatMap and point, code that performs IO can be written using for comprehensions for cleaner sequencing of operations.