Operational-style Applicative, Alternative, Monad and MonadPlus, using free monads.