<div dir="ltr"><br><br><div class="gmail_quote">On Fri Feb 20 2015 at 1:23:25 AM Roman Cheplyaka <<a href="mailto:roma@ro-che.info">roma@ro-che.info</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 20/02/15 07:26, Eugene Kirpichov wrote:<br>
><br>
><br>
> On Tue Feb 17 2015 at 11:50:20 PM Roman Cheplyaka <<a href="mailto:roma@ro-che.info" target="_blank">roma@ro-che.info</a><br>
> <mailto:<a href="mailto:roma@ro-che.info" target="_blank">roma@ro-che.info</a>>> wrote:<br>
><br>
>     Note that foldr (+) 0 has nothing to do with laziness — it's eager. Its<br>
>     problem is that it's not tail-recursive.<br>
><br>
> The problem is that when you say foldr (+) 0 [1, 2, 3, 4, 5] you build a<br>
> thunk "1 + (2 + (3 + (4 + (5 + 0))))", which has - let's call it "whnf<br>
> evaluation depth" of 4 (you need a stack of size 4 to evaluate it to whnf).<br>
<br>
This is not a thunk. These values would be pushed to the stack, but no<br>
thunks will be created.<br>
<br>
Just so that you have no doubts left, here's the STG code for foldr (+) 0:<br>
<br>
$wgo = \r srt:SRT:[] [w]<br>
  case w of _ {<br>
    [] -> 0;<br>
    : y ys -><br>
      case y of _ {<br>
        I# x -> case $wgo ys of ww {<br>
          __DEFAULT -> +# [x ww];<br>
        };<br>
      };<br>
  };<br>
<br>
As you can see, there are no lets here, only cases.<br></blockquote><div>Indeed - I guess the strictness analyzer did its job.</div><div>Nevertheless, the expression foldr (+) 0 [1..n] requires an evaluation stack depth of n and I would like it to be uncompilable - I would like the type of foldr (+) 0 to be "[Int] -> Int@\infty"</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Roman<br>
</blockquote></div></div>