<span class="Apple-style-span" style="font-size: small;">Using GHCi I found it informative to see that &nbsp;IO indeed&nbsp;is a kind of state monad. Here&#39;s a GHCi session to show that:</span><div><div><span class="Apple-style-span" style="font-size: small;"><br>
</span></div><div><div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;, monospace;"><span class="Apple-style-span" style="font-size: small;">Prelude&gt; :m GHC.Prim</span></span></div><div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;, monospace;"><span class="Apple-style-span" style="font-size: small;">Prelude GHC.Prim&gt; :i IO</span></span></div>
<div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;, monospace;"><span class="Apple-style-span" style="font-size: small;">newtype IO a</span></span></div><div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;, monospace;"><span class="Apple-style-span" style="font-size: small;">&nbsp;&nbsp;= <a href="http://GHC.IOBase.IO">GHC.IOBase.IO</a> </span><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="font-size: small;">(State# RealWorld -&gt; (# State# RealWorld, a #))</span></span></span></div>
<div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;, monospace;"><span class="Apple-style-span" style="font-size: small;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;-- Defined in GHC.IOBase</span></span></div><div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;, monospace;"><span class="Apple-style-span" style="font-size: small;">instance Monad IO -- Defined in GHC.IOBase</span></span></div>
<div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;, monospace;"><span class="Apple-style-span" style="font-size: small;">instance Functor IO -- Defined in GHC.IOBase</span></span></div><div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;; "><span class="Apple-style-span" style="font-size: small;"><br>
</span></span></div><div><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: arial, helvetica, sans-serif;">So every &quot;IO a&quot; action takes the&nbsp;RealWorld&nbsp;as input, and outputs the&nbsp;RealWorld&nbsp;and some extra value &quot;a&quot; :) &nbsp;</span></span></div>
<div><br></div></div><div><div><div class="gmail_quote"><span class="Apple-style-span" style="font-size: small;">2008/12/23 Adrian Neumann </span><span dir="ltr"><span class="Apple-style-span" style="font-size: small;">&lt;<a href="mailto:aneumann@inf.fu-berlin.de">aneumann@inf.fu-berlin.de</a>&gt;</span></span><span class="Apple-style-span" style="font-size: small;"><br>
</span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><span class="Apple-style-span" style="font-size: small;">Am 23.12.2008 um 15:16 schrieb Hans van Thiel:</span><div class="Ih2E3d">
<span class="Apple-style-span" style="font-size: small;"><br><br></span>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="Apple-style-span" style="font-size: small;">
Hello All,<br><br>
I just saw somewhere that one of the purposes of monads is to capture<br>
side effects. I understand what a side effect is in C, for example. Say<br>
you want to switch the contents of two variables. Then you need a third<br>
temporary variable to store an intermediate result. If this is global,<br>
then it will be changed by the operation.<br></span>

</blockquote>
<span class="Apple-style-span" style="font-size: small;"><br></span></div><span class="Apple-style-span" style="font-size: small;">
But the two variables have also changed. After all they have different values after the switch. You see, even locally changing a variable is a side-effect. It changes the state of the program. Pure Haskell programs on the other hand have no notion of state, there are no variables which can change their value. Every time you want to manipulate something you&#39;re actually generating an new copy. You mustn&#39;t think of a haskell program as a series of changes to some state.<br>
<br>
However when you *do* want state you can simulate it with a monad. The IO Monad is a special case here, since its actions don&#39;t change your program, they change the &quot;world&quot; the program is running in (writing files etc.). getLine etc are functions when you think of them as taking a hidden parameter, the state of the world. So getChar would become<br>
<br>
getChar :: World -&gt; (Char,World)<br><br>
but the world stays hidden inside the IO Monad.<br><br>
Regards,<br></span>



<font color="#888888"><span class="Apple-style-span" style="font-size: small;">
<br>
Adrian<br><br></span>

</font><span class="Apple-style-span" style="font-size: small;"><br>______________________________</span><span class="Apple-style-span" style="font-size: small;">_________________<br>
Haskell-Cafe mailing list<br></span>
<a href="mailto:Haskell-Cafe@haskell.org"><span class="Apple-style-span" style="font-size: small;">Haskell-Cafe@haskell.org</span></a><span class="Apple-style-span" style="font-size: small;"><br></span>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank"><span class="Apple-style-span" style="font-size: small;">http://www.haskell.org/</span><span class="Apple-style-span" style="font-size: small;">mailman/listinfo/haskell-cafe</span></a><span class="Apple-style-span" style="font-size: small;"><br>
<br></span>
</blockquote></div><br></div></div></div>