<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>Well, Yes, If the consumer side consume the result properly (not
      getting in the way of GC),  a space leak could be avoided.<br>
    </p>
    <br>
    <div class="moz-cite-prefix">On 2018年06月20日 18:54, David Feuer
      wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAMgWh9ssfhM5pLP+YhxgDm2=KPfY9Y-XXEgLhVxnifsmQtuogA@mail.gmail.com">
      <div dir="auto">
        <div>
          <div class="gmail_quote">
            <div dir="ltr">On Tue, Jun 19, 2018, 9:54 PM Dr.Koster <<a
                href="mailto:drkoster@qq.com" moz-do-not-send="true">drkoster@qq.com</a>>
              wrote:<br>
            </div>
            <blockquote class="gmail_quote" style="margin:0 0 0
              .8ex;border-left:1px #ccc solid;padding-left:1ex">
              <div style="min-height:22px;margin-bottom:8px">In general
                infinite monadic recursion will leak, since the tail
                position is always >> or >>= instead of your
                own recursive function</div>
            </blockquote>
          </div>
        </div>
        <div dir="auto"><br>
        </div>
        <div dir="auto">That seems a bit strong. Monadic recursion *can*
          leak, but it need not. >>= is typically lazy in its
          second argument, so it can produce structure lazily. Consider
          the free monad, for example:</div>
        <div dir="auto"><br>
        </div>
        <div dir="auto">data Free f a = Pure a | Wrap (f (Free f a))</div>
        <div dir="auto"><br>
        </div>
        <div dir="auto">instance Functor f => Monad (Free f) where</div>
        <div dir="auto">  Pure a >>= f = f a</div>
        <div dir="auto">  Wrap ff >>= f = Wrap $ fmap (>>=
          f) ff</div>
        <div dir="auto"><br>
        </div>
        <div dir="auto">See how we can produce Wrap without using f? As
          long as the base functor isn't too large, this shouldn't leak.</div>
        <div dir="auto"><br>
        </div>
        <div dir="auto">
          <div class="gmail_quote">
            <blockquote class="gmail_quote" style="margin:0 0 0
              .8ex;border-left:1px #ccc solid;padding-left:1ex">
              <div style="min-height:22px;margin-bottom:8px">, but under
                certain situations, e.g. IO without arguments, the
                compiler will figure there's no need to push new stack
                frame. But anyway it's better to checkout yourself
                rather relying on some weak assumptions.</div>
              <div style="min-height:22px;margin-bottom:8px"><br>
              </div>
              <span class="m_3687407683116088054mail-footer">发自我的iPhone</span>
              <div id="m_3687407683116088054original-content"><br>
                <br>
                <div>
                  <div style="font-size:70%;padding:2px 0">------------------
                    Original ------------------</div>
                  <div
style="font-size:70%;background:#f0f0f0;color:#212121;padding:8px;border-radius:4px">
                    <div><b>From:</b> Никита Фуфаев <<a
                        href="mailto:kitttoran@gmail.com"
                        target="_blank" rel="noreferrer"
                        moz-do-not-send="true">kitttoran@gmail.com</a>></div>
                    <div><b>Date:</b> Wed,Jun 20,2018 2:37 AM</div>
                    <div><b>To:</b> haskell-cafe <<a
                        href="mailto:haskell-cafe@haskell.org"
                        target="_blank" rel="noreferrer"
                        moz-do-not-send="true">haskell-cafe@haskell.org</a>></div>
                    <div><b>Subject:</b> Re: [Haskell-cafe] Memory leak
                      in infinite recursion</div>
                  </div>
                </div>
                <br>
                <div dir="ltr">Hello everyone<br>
                  <div><br>
                  </div>
                  <div>In C you can't implement main loop with recursion
                    like</div>
                  <div>void mainLoop() {</div>
                  <div>  doSomething();</div>
                  <div>  mainLoop();</div>
                  <div>}  </div>
                  <div>because without optimisations stack will
                    overflow.</div>
                  <div>In haskell it's common to write</div>
                  <div>mainLoop = doSomething >> mainLoop, and it
                    doesn't leak memory because of haskell's evaluation
                    model.</div>
                  <div>Does memory leak or argument stack overflow
                    happen in this case?</div>
                  <div>mainLoop = doSomething >> mainLoop >>
                    exit ExitSuccess</div>
                  <div>What about this case?</div>
                  <div>mainLoopModeA = do</div>
                  <div>  doSomething</div>
                  <div>  when condition mainLoopModeB</div>
                  <div>  mainLoopModeA</div>
                  <div>mainLoopModeB = do</div>
                  <div>  doSomethingElse</div>
                  <div>  when anotherCondition mainLoopModeA</div>
                  <div>  mainLoopModeB</div>
                  <div>
                    <div
style="font-size:small;text-decoration-style:initial;text-decoration-color:initial"><br>
                      or this case?</div>
                    <div
style="font-size:small;text-decoration-style:initial;text-decoration-color:initial">mainLoopModeA
                      = do</div>
                    <div
style="font-size:small;text-decoration-style:initial;text-decoration-color:initial"> 
                      doSomething</div>
                    <div
style="font-size:small;text-decoration-style:initial;text-decoration-color:initial"> 
                      if condition</div>
                    <div
style="font-size:small;text-decoration-style:initial;text-decoration-color:initial"> 
                        then mainLoopModeB</div>
                    <div
style="font-size:small;text-decoration-style:initial;text-decoration-color:initial"> 
                        else mainLoopModeA</div>
                    <div
style="font-size:small;text-decoration-style:initial;text-decoration-color:initial">mainLoopModeB
                      = do</div>
                    <div
style="font-size:small;text-decoration-style:initial;text-decoration-color:initial"> 
                      doSomethingElse</div>
                    <div
style="font-size:small;text-decoration-style:initial;text-decoration-color:initial"> 
                      if anotherCondition </div>
                    <div
style="font-size:small;text-decoration-style:initial;text-decoration-color:initial"> 
                        then mainLoopModeA</div>
                    <div
style="font-size:small;text-decoration-style:initial;text-decoration-color:initial"> 
                        else mainLoopModeB</div>
                  </div>
                  <br>
                  -- <br>
                  <div class="m_3687407683116088054gmail_signature"
                    data-smartmail="gmail_signature">
                    <div dir="ltr">
                      <div dir="ltr">
                        <div dir="ltr">Nikita Fufaev<br>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
              _______________________________________________<br>
              Haskell-Cafe mailing list<br>
              To (un)subscribe, modify options or view archives go to:<br>
              <a
                href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe"
                rel="noreferrer noreferrer" target="_blank"
                moz-do-not-send="true">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
              Only members subscribed via the mailman list are allowed
              to post.</blockquote>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
  </body>
</html>