<div dir="ltr"><div></div><div>From what I understand, this code <br></div><div><br></div><span style="font-family:monospace,monospace">main = forever $ do<br></span><div><span style="font-family:monospace,monospace">  putStrLn "OK !"</span></div><div><br></div><div>is equivalent to this one :<br></div><div><br><span style="font-family:monospace,monospace">main = do<br>  putStrLn "OK !"<br>  main</span><br></div><div><br></div><div>In the second case, it's a simple recursion, so far so good ... but when I look at the implementation of "forever" i can't wrap my head around :</div><div><br></div><div><a href="http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Control.Monad.html#forever">http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Control.Monad.html#forever</a></div><div><br></div><div>
<pre><a href="http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Control.Monad.html#forever" class="gmail-"><span class="gmail-hs-identifier">forever</span></a><span> </span><a name="local-6989586621679327090"></a><a href="http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Control.Monad.html#local-6989586621679327090" class="gmail-"><span class="gmail-hs-identifier">a</span></a><span>   </span><span class="gmail-hs-glyph">=</span><span> </span><span class="gmail-hs-keyword">let</span><span> </span><a name="local-6989586621679327091"></a><a href="http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Control.Monad.html#local-6989586621679327091" class="gmail-"><span class="gmail-hs-identifier">a'</span></a><span> </span><span class="gmail-hs-glyph">=</span><span> </span><a href="http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Control.Monad.html#local-6989586621679327090" class="gmail-"><span class="gmail-hs-identifier gmail-hs-var">a</span></a><span> </span><a href="http://hackage.haskell.org/package/base-4.11.1.0/docs/src/GHC.Base.html#%2A%3E" class="gmail-"><span class="gmail-hs-operator gmail-hs-var">*></span></a><span> </span><a href="http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Control.Monad.html#local-6989586621679327091" class="gmail-"><span class="gmail-hs-identifier gmail-hs-var">a'</span></a><span> </span><span class="gmail-hs-keyword">in</span><span> </span><a href="http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Control.Monad.html#local-6989586621679327091" class="gmail-"><span class="gmail-hs-identifier gmail-hs-var">a'</span></a><span></span></pre>

How does this works ? How does this make an infinite loop ?</div><div><br></div><div>I understand that *> discard his right argument but it doesn't help me understand how forever implement an infinite loop ...<br><br></div><div><br></div><div><br></div><div><br></div></div>