In the previous chapter, we looked at Functor, Applicative, and monads. In this chapter, we will look at State Monad, a monad where we can store a state and modify it. Once we understand monad, we will understand that we can implement a monad (or an Applicative) for a specific purpose.
It is very likely that a situation will arise where we would like to combine two monads to make a single monad. For example, consider a parser monad, Parser a and a State Monad State s a (where s is the state and a is the output of the parser). If we also would like to maintain a state along with the parsing output, then we can combine them together with Parser (State s a). With this, now, we can either operate in the outer Parser monad or internal State s a monad.
Let's take an example of IO monad with Maybe:
foo :: IO (Maybe Int)
foo = Just 10
bar :: IO (Maybe Int...