Wow, I don&#39;t get core haskell, but I get you point.<br>It&#39;s indeed odd foldl&#39; doesn&#39;t use foldr (and sum doesn&#39;t use foldl&#39; instead of foldl as (+) is strict (*)) if foldr permits loop fusion.<br><br>

(*) Anyway, is there a place where foldl is preferable over foldl&#39; ? Never happened to me, I always use right-folding if I want lazy evaluation, to benefit from guarded recursion.<br><br><div class="gmail_quote">2011/10/14 Bas van Dijk <span dir="ltr">&lt;<a href="mailto:v.dijk.bas@gmail.com">v.dijk.bas@gmail.com</a>&gt;</span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im">On 13 October 2011 20:53, Albert Y. C. Lai &lt;<a href="mailto:trebla@vex.net">trebla@vex.net</a>&gt; wrote:<br>


&gt; The number of new cons cells created in due course is »(length xs).<br>
<br>
</div>I was actually surprised by this because I expected: length(xs++ys) to<br>
fuse into one efficient loop which doesn&#39;t create cons cells at all.<br>
<br>
Unfortunately, I was mistaken since length is defined recursively.<br>
<br>
length :: [a] -&gt; Int<br>
length l = †len l 0#<br>
 †where<br>
 † †len :: [a] -&gt; Int# -&gt; Int<br>
 † †len [] † † a# = I# a#<br>
 † †len (_:xs) a# = len xs (a# +# 1#)<br>
<br>
However, if we would define it as:<br>
<br>
length = foldl&#39; (l _ -&gt; l+1) 0<br>
<br>
And implemented foldl&#39; using foldr as described here:<br>
<br>
<a href="http://www.haskell.org/pipermail/libraries/2011-October/016895.html" target="_blank">http://www.haskell.org/pipermail/libraries/2011-October/016895.html</a><br>
<br>
then fuse = length(xs++ys) where for example xs = replicate 1000000 1<br>
and ys = replicate 5000 (1::Int) would compile to the following<br>
totally fused core:<br>
<br>
fuse :: Int<br>
fuse = case $wxs 1000000 0 of ww_srS {<br>
 † † † † __DEFAULT -&gt; I# ww_srS<br>
 † † † }<br>
<br>
$wxs :: Int# -&gt; Int# -&gt; Int#<br>
$wxs = \ (w_srL :: Int#) (ww_srO :: Int#) -&gt;<br>
 † †case &lt;=# w_srL 1 of _ {<br>
 † † †False -&gt; $wxs (-# w_srL 1) (+# ww_srO 1);<br>
 † † †True †-&gt; $wxs1_rs8 5000 (+# ww_srO 1)<br>
 † †}<br>
<br>
$wxs1_rs8 :: Int# -&gt; Int# -&gt; Int#<br>
$wxs1_rs8 =<br>
 †\ (w_srA :: Int#) (ww_srD :: Int#) -&gt;<br>
 † †case &lt;=# w_srA 1 of _ {<br>
 † † †False -&gt; $wxs1_rs8 (-# w_srA 1) (+# ww_srD 1);<br>
 † † †True †-&gt; +# ww_srD 1<br>
 † †}<br>
<font color="#888888"><br>
Bas<br>
</font><div><div></div><div class="h5"><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>
</div></div></blockquote></div><br>