<div dir="auto"><div>Hi Viktor</div><div dir="auto"><br></div><div dir="auto">What I think the OP is asking for is a case where the original list would be returned immediately if the second is empty -- keeping the original spine. Since that case is missing then the list is pattern-matched and then reconstructed. Whether this actually happens after compilation is the real question.<br><div class="gmail_extra" dir="auto"><br><div class="gmail_quote">On Mar 4, 2018 21:24, "Viktor Dukhovni" <<a href="mailto:ietf-dane@dukhovni.org">ietf-dane@dukhovni.org</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="quoted-text"><br>
<br>
> On Mar 4, 2018, at 4:32 AM, Ben Franksen <<a href="mailto:ben.franksen@online.de">ben.franksen@online.de</a>> wrote:<br>
><br>
> I found that in base [1] we have<br>
><br>
> (++) []     ys = ys<br>
> (++) (x:xs) ys = x : xs ++ ys<br>
><br>
> I had expected there to be a clause<br>
><br>
> (++) xs     [] = xs<br>
><br>
> at the top, which would avoid the list traversal in this common case.<br>
><br>
</div>> [...]<br>
<div class="quoted-text">><br>
> which still traverses xs even if ys=[].<br>
><br>
> Any thoughts?<br>
<br>
</div>Haskell is lazy, the traversal of x happens only when the combined list<br>
is actually traversed, and only for as many elements as requested, so<br>
the construction of the concatenated list carries little additional cost.<br>
And as pointed out, needlessly forcing the first element of y can have<br>
unintended consequences.<br>
<br>
For example:<br>
<br>
GHCi, version 8.0.2: <a href="http://www.haskell.org/ghc/" rel="noreferrer" target="_blank">http://www.haskell.org/ghc/</a>  :? for help<br>
Prelude> let x = [1..]<br>
Prelude> let y = [1..]<br>
Prelude> let z = x ++ y<br>
Prelude> take 20 z<br>
[1,2,3,4,5,6,7,8,9,10,11,12,<wbr>13,14,15,16,17,18,19,20]<br>
<font color="#888888"><br>
--<br>
        Viktor.<br>
</font><div class="elided-text"><br>
______________________________<wbr>_________________<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" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</div></blockquote></div><br></div></div></div>