Threading state is something that the State monad does and it is<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

purely functional - showing that a monad *can* be pure but don&#39;t have<br>
to be. Other monads, like IO as you have stated, have side effects.<br></blockquote><div><br>Thank
 you, that helps.<br> <br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

At the end of the day I found that the monad is very, very general and<br>
it&#39;s best way to think about it as a piece of data wrapped in some<br>
type. With a monad you can<br>
1. takes some data and wraps it up in a type (return) :<br>
a -&gt; m a<br>
2. apply a function to the data within the type (&gt;&gt;=).<br>
m a -&gt; (a -&gt; m b) -&gt; m b<br></blockquote><div> </div>But if 
that&#39;s all you need to do, you could just use an Applicative Functor, 
right? The picture I have at the moment is:<br><br>Functors can apply a 
function to a value inside a container.<br><br>Applicative functors 
provide pure expressions and sequencing, but no binding. All applicative
 functors are also functors.<br>
<br>Arrows provide a way to set up more complicated pipelines with &quot;tee&quot;
 
junctions, etc. All arrows are also applicative functors (?)<br>
<br>
Monads add binding. All monads are also arrows.<br><br>