Chapter 6. Purely functional state


In this chapter, we’ll see how to write purely functional programs that manipulate state, using the simple domain of random number generation as the example. Although by itself it’s not the most compelling use case for the techniques in this chapter, the simplicity of random number generation makes it a good first example. We’ll see more compelling use cases in parts 3 and 4 of the book, especially part 4, where we’ll say a lot more about dealing with state and effects. The goal here is to give you the basic pattern for how to make any stateful API purely functional. As you start writing your own functional APIs, you’ll likely run into many of the same questions that we’ll explore here.

6.1. Generating random numbers using side effects

If you need to generate random[1] numbers in Scala, there’s a class in the standard library, scala.util.Random,[2] with a pretty typical imperative API that relies on side effects. Here’s an example of its use.

1 Actually, pseudo-random, but we’ll ignore this distinction.

2 Scala API link:

6.2. Purely functional random number generation

6.3. Making stateful APIs pure

6.4. A better API for state actions

6.5. A general state action data type

6.6. Purely functional imperative programming

6.7. Summary