<blockquote style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;" class="gmail_quote">Everything in Haskell is a function [...]</blockquote><div><br>Where did this idea come from?<br>
<br>I&#39;d say every expression in Haskell denotes a pure value, only some of which are functions (have type a-&gt;b for some types a &amp; b).<br><br>&nbsp; - Conal<br></div><br><div class="gmail_quote">On Sat, Dec 27, 2008 at 12:16 PM, Cristiano Paris <span dir="ltr">&lt;<a href="mailto:frodo@theshire.org">frodo@theshire.org</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="Ih2E3d">On Sat, Dec 27, 2008 at 4:50 PM, Hans van Thiel &lt;<a href="mailto:hthiel.char@zonnet.nl">hthiel.char@zonnet.nl</a>&gt; wrote:<br>

<br>
&gt; However, some functions in Haskell may have side effects, like printing<br>
&gt; something on the screen, updating a database, or producing a random<br>
&gt; number. These functions are called &#39;actions&#39; in Haskell.<br>
<br>
</div>No :D I&#39;ll try to explain using the same picture that came into my<br>
mind when I first got what monads really are...<br>
<br>
Everything in Haskell is a function AND an Haskell function is always<br>
pure, i.e. has no side effects.<br>
<br>
Functions may return &quot;actions&quot;, which are a special kind of value even<br>
though they are no different to Haskell from values of any other type.<br>
<br>
When you are returning an action is like when you go to a driver and<br>
give him a car: the driver takes the car you gave him and takes it<br>
wherever the car is supposed to go. You build the car using small<br>
pieces (i.e. basic functions returning actions like putStrLn) and<br>
putting everything together using combinators (like &gt;&gt;= and &gt;&gt; or the<br>
&quot;do&quot; notation).<br>
<br>
So, the car in the example is an &quot;action&quot; (or, more formally, a value<br>
in a monad). Your Haskell functions (like putStrLn or anything) just<br>
return the car, but they don&#39;t run it: they are run at run-time by the<br>
Haskell run-time environment whose only task is to run values in the<br>
IO Monad, i.e. running the car.<br>
<br>
Even it may not be apparent for the IO Monad, every Monad value is run<br>
at some point in time: almost every monad is associated to at least a<br>
function running the monad: for the State Monad this is runState, for<br>
the Reader Monad is runReader and so on.<br>
<br>
The only exception to this is the IO Moand, which can be run only by<br>
the Haskell run time, implicitly: this is the reason why you&#39;ll never<br>
see a &quot;runIO&quot; &nbsp;thing.<br>
<br>
When the monad is run, it generate side-effects, like printing to<br>
screen, opening file and so on.<br>
<br>
If you&#39;re used to Unix administration, another image to understand<br>
monads are scripts. Haskell functions return script files that are run<br>
by the shell to affect the system they are run on. In the end, they<br>
are small pieces (the basic commands present in the system) put<br>
together by bash constructs, like &quot;for&quot;, &quot;while&quot; and so on.<br>
<br>
Hope this helps.<br>
<br>
--<br>
<font color="#888888">Cristiano<br>
</font><div><div></div><div class="Wj3C7c">_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</div></div></blockquote></div><br>