We've covered a lot of cool concepts with scary names but with simple ideas behind them. The functor, applicative, and monad types open the door for several abstractions and more powerful functional concepts that we'll cover in the following chapters. We learned about some of the limitations of Kotlin and how we can overcome them as we create functions to mimic functor, applicative, and monad for different types. We also explored the hierarchical relationship between functors, applicatives, and monads.
In the next chapter, we'll cover how to work effectively with Streams of data.