[Haskell-cafe] Type systems preventing laziness-related memory leaks?
Roman Cheplyaka
roma at ro-che.info
Fri Feb 20 09:23:22 UTC 2015
On 20/02/15 07:26, Eugene Kirpichov wrote:
>
>
> On Tue Feb 17 2015 at 11:50:20 PM Roman Cheplyaka <roma at ro-che.info
> <mailto:roma at ro-che.info>> wrote:
>
> Note that foldr (+) 0 has nothing to do with laziness — it's eager. Its
> problem is that it's not tail-recursive.
>
> The problem is that when you say foldr (+) 0 [1, 2, 3, 4, 5] you build a
> thunk "1 + (2 + (3 + (4 + (5 + 0))))", which has - let's call it "whnf
> evaluation depth" of 4 (you need a stack of size 4 to evaluate it to whnf).
This is not a thunk. These values would be pushed to the stack, but no
thunks will be created.
Just so that you have no doubts left, here's the STG code for foldr (+) 0:
$wgo = \r srt:SRT:[] [w]
case w of _ {
[] -> 0;
: y ys ->
case y of _ {
I# x -> case $wgo ys of ww {
__DEFAULT -> +# [x ww];
};
};
};
As you can see, there are no lets here, only cases.
Roman
More information about the Haskell-Cafe
mailing list