This was an intense chapter. We learned about the concept of working with effects in a way that the knowledge of the effects' structure is outsourced to another abstraction. We looked at three such abstractions.
The Functor allows us to apply a function of one argument to each element stored in the container.
The Applicative (or applicative functor) extends the Functor in a way that it is possible to apply a function of two arguments (and by induction, functions of any number of arguments). We’ve seen that it is possible to choose one of three equally valid sets of primitives that define applicative and derive all of the other methods from these primitives.
We said that this approach of defining a minimal set of primitive functions and the rest of functionality in terms of these primitives is a common approach in functional programming.
The last abstraction...