<div dir="ltr"><div class="gmail_default" style="font-family:verdana,sans-serif">The way forever is implemented is a bit obtuse. It's mainly a hack to make GHC's optimizer avoid space leaking no matter what the surrounding code is.<br>

<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">You can think of the implementation as just:<br><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">forever :: Monad m => m a -> m b<br>

forever act = do<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">  act<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">  forever act<br><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">

which is pretty much what you'd do in an imperative language, so it's not that crazy.<br><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">You can see the similarity if you replace the do notation with manual binds and rename 'act' to 'a':<br>

<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">forever :: Monad m => m a -> m b<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">forever a = a >> forever a<br>

<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Again, the knot tying stuff is just to prevent a space leak in certain optimization scenarios.<br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">

On Mon, Dec 23, 2013 at 9:02 PM, Eduardo Sato <span dir="ltr"><<a href="mailto:eduardo.sato@gmail.com" target="_blank">eduardo.sato@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<pre><font face="Helvetica Neue, Helvetica, Arial, sans-serif" size="3"><span style="white-space:normal">Hello, guys.</span></font></pre><pre><font face="Helvetica Neue, Helvetica, Arial, sans-serif" size="3"><span style="white-space:normal">Recently I came across the definition of the function 'forever' on hoogle. I am intrigued that it works.</span></font></pre>


<pre><font face="Helvetica Neue, Helvetica, Arial, sans-serif" size="3"><span style="white-space:normal">The recursive definition does make sense to me in a mathematical way, but I can't figure out how it works under the hood in terms of thunks.</span></font></pre>


<pre><font face="Helvetica Neue, Helvetica, Arial, sans-serif" size="3"><span style="white-space:normal">To tell you the truth, I don't know how laziness works in general in haskell.</span></font></pre><pre><font face="Helvetica Neue, Helvetica, Arial, sans-serif" size="3"><span style="white-space:normal">Can someone help me understand how it works in this example, and give some pointers to materials on the subject?</span></font></pre>


<pre><font face="Helvetica Neue, Helvetica, Arial, sans-serif" size="3"><span style="white-space:normal">The "tying the knot" article on the wiki is pretty mind bending too. </span></font></pre><pre><font face="Helvetica Neue, Helvetica, Arial, sans-serif" size="3"><span style="white-space:normal;background-color:rgba(255,255,255,0)"><span>-- | @'forever' act@ repeats the action infinitely.</span> </span></font></pre>


<pre><font face="Helvetica Neue, Helvetica, Arial, sans-serif" size="3"><span style="white-space:normal;background-color:rgba(255,255,255,0)"><a name="1432256dd8ae15a4_line-192"></a><span>forever</span>     <span>::</span> <span>(</span><span>Monad</span> <span>m</span><span>)</span> <span>=></span> <span>m</span> <span>a</span> <span>-></span> <span>m</span> <span>b</span> </span></font></pre>


<pre><font face="Helvetica Neue, Helvetica, Arial, sans-serif" size="3"><span style="white-space:normal;background-color:rgba(255,255,255,0)"></span></font><span style="white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium">{-# INLINE forever #-}</span><span style="background-color:rgba(255,255,255,0);white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium">
</span><a name="1432256dd8ae15a4_line-194" style="white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium"></a><span style="white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium">forever</span><span style="background-color:rgba(255,255,255,0);white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium"> </span><span style="white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium">a</span><span style="background-color:rgba(255,255,255,0);white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium">   </span><span style="white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium">=</span><span style="background-color:rgba(255,255,255,0);white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium"> </span><span style="white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium">let</span><span style="background-color:rgba(255,255,255,0);white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium"> </span><span style="white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium">a'</span><span style="background-color:rgba(255,255,255,0);white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium"> </span><span style="white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium">=</span><span style="background-color:rgba(255,255,255,0);white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium"> </span><span style="white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium">a</span><span style="background-color:rgba(255,255,255,0);white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium"> </span><span style="white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium">>></span><span style="background-color:rgba(255,255,255,0);white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium"> </span><span style="white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium">a'</span><span style="background-color:rgba(255,255,255,0);white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium"> </span><span style="white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium">in</span><span style="background-color:rgba(255,255,255,0);white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium"> </span><span style="white-space:normal;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:medium">a'</span></pre>


<pre>--</pre><pre>Eduardo Sato </pre>
<br>_______________________________________________<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>
<br></blockquote></div><br><br clear="all"><br>-- <br><div dir="ltr">Clark.<br><br><span style="font-family:courier new,monospace"><span style="color:rgb(153,153,153)"><font size="1">Key ID     : 0x78099922<br>Fingerprint: B292 493C 51AE F3AB D016  DD04 E5E3 C36F 5534 F907</font></span></span></div>


</div>