Our last abstraction will solve the very problem that we raised in the previous section—how to safely perform intermediate calculations by preserving the semantics of the abstractions that we're working with (in this case, options).
It should be no surprise by now that fluokitten also provides a protocol for monads, simplified and shown as follows:
(defprotocol Monad (bind [mv g]))
If you think in terms of a class hierarchy, monads would be at the bottom of it, inheriting from applicative functors, which, in turn, inherit from functors. That is, if you're working with a monad, you can assume that it is also an applicative and a functor.
The bind function of monads takes a function, g, as its second argument. This function receives as input the value contained in mv, and returns another monad containing its result. This is a crucial part of the contract...