The function application is not the monad per se, it's the bind in the Identity monad.
newtype Identity a = Identity { runIdentity :: a }
instance Monad Identity where
return = Identity
(Identity a) >>= f = f a -- :: Identity a -> (a -> Identity b) -> Identity b
join (Identity (Identity a)) = Identity a
fmap f (Identity a) = Identity $ f a
So if you lift all your functions and values into the identity monad, you can use do-notation and it'll just be a lot of bookkeeping around ordinary function application.
You should not confuse this with the Monad instance for the type (->) a
which is isomorphic to the reader Monad: newtype Reader a b = Reader { runReader :: a -> b }
.