<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;"><p>From Hoogle:<br>
  </p><p><br></p><p>Query: <tt>(<span id="error">:[])</span></tt><br>
</p><p>
  Error: <br>unexpected ":"<br>expecting "#", ",", "forall", "(", "[", "!" or ")"<br>Bad symbol</p><br><br>Prelude&gt; let h = length . (:[]) . head<br>Prelude&gt; h undefined<br>1<br>Prelude&gt; :t (:[])<br>(:[]) :: a -&gt; [a]<br>Prelude&gt; h []<br>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;======== this comes as a surprise<br>Prelude&gt; <br><br>Are you saying:<br><br>[ head x ]&nbsp; -&gt;&nbsp; [ *thunk* ]&nbsp;&nbsp; and&nbsp;&nbsp; length [ *thunk* ] -&gt;&nbsp; 1, independent of what *thunk* is, even head [], i.e., *thunk* never needs be evaluated?<br><br>Michael<br><p><br>
</p><br><br>--- On <b>Sat, 7/31/10, Ben Millwood <i>&lt;haskell@benmachine.co.uk&gt;</i></b> wrote:<br><blockquote style="border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><br>From: Ben Millwood &lt;haskell@benmachine.co.uk&gt;<br>Subject: Re: [Haskell-cafe] Laziness question<br>To: "michael rice" &lt;nowgate@yahoo.com&gt;<br>Cc: haskell-cafe@haskell.org<br>Date: Saturday, July 31, 2010, 1:47 PM<br><br><div class="plainMail">On Sat, Jul 31, 2010 at 5:59 PM, michael rice &lt;<a ymailto="mailto:nowgate@yahoo.com" href="/mc/compose?to=nowgate@yahoo.com">nowgate@yahoo.com</a>&gt; wrote:<br>&gt;<br>&gt; OK, in f, *length* already knows it's argument is a list.<br>&gt;<br>&gt; In g, *length* doesn't know what's inside the parens, extra evaluation there. So g is already ahead before we get to what's inside the [] and ().<br><br>According to the types, we already know both are lists. The question<br>is, of course, what kind of
 list.<br><br>&gt; But since both still have eval x to *thunk* : *thunk*,&nbsp; g evaluates "to a deeper level?"<br>&gt;<br>&gt; Michael<br>&gt;<br><br>I think this question is being quite sneaky. The use of head and tail<br>is pretty much irrelevant. Try the pointfree versions:<br><br>f = length . (:[]) . head<br>g = length . tail<br><br>and see if that helps you see why f is lazier than g.<br></div></blockquote></td></tr></table><br>