In this chapter, we learned about the patterns of advanced functional programming.
First, we looked at Monad Transformers. These are used to construct compound effect types. Given two independent effect types that describe their own side effects, you can stack them one on top of another to get a combined type from them.
After that, we explored the Tagless Final pattern. The main benefit is inversion of control when you can have a single implementation of your business logic run against different effects systems to gain different semantics.
Finally, we learned about a pattern of type-level computations in functional programming. The main benefit of these is that they allow you to impose guarantees on your program encoded in terms of types, and have these guarantees checked at compile-time. This checking can be achieved with the mechanism of type-level computational...