woow :) I am loving this language.&nbsp; <br>Thank you all for very useful hints and thanks for the exercise about&nbsp;&nbsp; map.map!<br><br><div><span class="gmail_quote">On 14/03/07, <b class="gmail_sendername">Big Chris</b> &lt;<a href="mailto:ccasingh@andrew.cmu.edu">
ccasingh@andrew.cmu.edu</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>Hi Vikrant,<br><br>The other two have said basically the same thing as me, but your
<br>description of map&#39;s type makes me think maybe an explanation of<br>curried functions is in order:<br><br>&nbsp;&nbsp; map is what&#39;s called a curried function.&nbsp;&nbsp;Basically, the type:<br><br>&nbsp;&nbsp; (a -&gt; b) -&gt; [a] -&gt; [b]
<br><br>&nbsp;&nbsp; has two interpretations.&nbsp;&nbsp;The first is the one you gave, which is a<br>good way to think about the function when you intend to apply it to<br>both its arguments at once.&nbsp;&nbsp;However, there is another way to think<br>
about the function as well.&nbsp;&nbsp;Consider that the type implicitly has<br>parenthesis like this:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;(a -&gt; b) -&gt; ([a] -&gt; [b])<br><br>That is, we can also think of map as a function which takes a function<br>from a to b, and returns a function from [a] to [b].&nbsp;&nbsp;In some sense, if
<br>we only provide map with its first argument, then it is still &quot;waiting&quot;<br>to take the [a] argument, so it becomes a function from [a] to [b].<br><br>If we think of may this way, we can see that when it is passed
<br>to itself, its type must be matched against the type of its first<br>argument.&nbsp;&nbsp;I&#39;ll rename the type variables to make things a little<br>clearer - what we have to do is unify:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(c -&gt; d) -&gt; ([c] -&gt; [d])
<br>and&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a&nbsp;&nbsp;&nbsp;&nbsp; -&gt;&nbsp;&nbsp;&nbsp;&nbsp; b<br><br><br>So in this case, when map returns a function from [a] -&gt; [b], you<br>get a function from [c -&gt; d] to [[c] -&gt; [d]].&nbsp;&nbsp;I hope this helps!<br><br>--Chris Casinghino<br><br>On Wed, 14 Mar 2007, Vikrant wrote:
<br><br>&gt; Hi,<br>&gt;&nbsp;&nbsp;I can understand why principle type of map is<br>&gt;<br>&gt; map :: (a -&gt; b) -&gt; [a] -&gt; [b] ,<br>&gt; I would interpret this as &quot;map takes a function of type a-&gt;b and a list of<br>
&gt; type [a] as arguments and returns a list of type [b]&quot;<br>&gt;<br>&gt; but it is going somewhat beyond my imagination why principle type of map map<br>&gt; is<br>&gt;<br>&gt; (map map)::[a -&gt; b] -&gt; [[a] -&gt; [b]]
<br>&gt;<br>&gt; I am able to interpret the expressions &quot;[a -&gt; b] -&gt; [[a] -&gt; [b]]&quot;<br>&gt; vaguely...<br>&gt;<br>&gt; does this mean that &#39;map map&#39; takes list of functions of type (a-&gt;b) and<br>
&gt; returns list of functions of type ([a]-&gt;[b])<br>&gt; if yes ..how do I derive it from basic type declaration of map?<br>&gt;<br>&gt; Thanks in advance<br>&gt; Vikrant<br>&gt;<br></blockquote></div><br>