<meta charset="utf-8"><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; color: rgb(68, 68, 68); ">Matt,<div><br></div><div>I was having issues with the very same problem not too long ago and I wrote a blog post about how it illustrates the power of partial application.</div>
<div><br></div><div><a href="http://nickelcode.com/2009/04/12/haskell-learnings/" target="_blank" style="color: rgb(34, 34, 34); ">http://nickelcode.com/2009/04/12/haskell-learnings/</a></div><div><br></div><div>Sorry for the blog plug, I just didn&#39;t see any reason to copy and paste the content. I make no claims about the quality of my writing but it does include some basic expansions of the execution/thunks for understanding.</div>
<div><br></div><div>Best</div></span><br><div class="gmail_quote">On Fri, May 14, 2010 at 6:58 AM, Brent Yorgey <span dir="ltr">&lt;<a href="mailto:byorgey@seas.upenn.edu">byorgey@seas.upenn.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Fri, May 14, 2010 at 12:29:01PM +1000, Matt Andrew wrote:<br>
&gt;<br>
&gt; The thing I am having trouble understanding is what the &#39;id&#39;<br>
&gt; function is doing in a function that expects 3 arguments and is<br>
&gt; given 4 (foldr).<br>
<br>
</div>&quot;Number of arguments&quot; in Haskell is a red herring.  In fact, every<br>
Haskell function takes exactly *one* argument.  Functions which appear<br>
to &quot;take more than one argument&quot; are really functions which take one<br>
argument and return another function (which takes the next argument,<br>
and so on).  That&#39;s why the type of a &quot;multi-argument&quot; function is written like<br>
<br>
  X -&gt; Y -&gt; Z -&gt; ...<br>
<br>
which can also be written more explicitly as<br>
<br>
  X -&gt; (Y -&gt; (Z -&gt; ...))<br>
<br>
Polymorphic functions (like foldr) can also be deceiving as far as<br>
&quot;number of arguments&quot; goes.  For example, consider id:<br>
<br>
  id :: a -&gt; a<br>
<br>
Looks like this takes only one argument, right?  Well, what if  a = (Int -&gt; Int):<br>
<br>
  id :: (Int -&gt; Int) -&gt; (Int -&gt; Int)<br>
<br>
which can also be written<br>
<br>
  id :: (Int -&gt; Int) -&gt; Int -&gt; Int<br>
<br>
so now it looks like id &quot;takes two arguments&quot; -- an (Int -&gt; Int)<br>
function, and an Int.  Of course, the real answer is that id always<br>
takes exactly one argument, just like any other function; but<br>
sometimes that argument may itself be a function, in which case<br>
the result can be applied to additional argument(s).<br>
<font color="#888888"><br>
-Brent<br>
</font><div><div></div><div class="h5">_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/beginners" target="_blank">http://www.haskell.org/mailman/listinfo/beginners</a><br>
</div></div></blockquote></div><br>