Chapter 13. External effects and I/O

 

In this chapter, we’ll take what we’ve learned so far about monads and algebraic data types and extend it to handle external effects like reading from databases and writing to files. We’ll develop a monad for I/O, aptly called IO, that will allow us to handle such external effects in a purely functional way.

We’ll make an important distinction in this chapter between effects and side effects. The IO monad provides a straightforward way of embedding imperative programming with I/O effects in a pure program while preserving referential transparency. It clearly separates effectful code—code that needs to have some effect on the outside world—from the rest of our program.

This will also illustrate a key technique for dealing with external effects—using pure functions to compute a description of an effectful computation, which is then executed by a separate interpreter that actually performs those effects. Essentially we’re crafting an embedded domain-specific language (EDSL) for imperative programming. This is a powerful technique that we’ll use throughout the rest of part 4. Our goal is to equip you with the skills needed to craft your own EDSLs for describing effectful programs.

13.1. Factoring effects

We’ll work our way up to the IO monad by first considering a simple example of a program with side effects.

13.2. A simple IO type

13.3. Avoiding the StackOverflowError

13.4. A more nuanced IO type

13.5. Non-blocking and asynchronous I/O

13.6. A general-purpose IO type

13.7. Why the IO type is insufficient for streaming I/O

13.8. Summary

sitemap