<div dir="ltr">So in effect<div><br></div><div><font face="monospace">a -> b -> [a] -> [b]</font><br></div><div><br></div><div>wants to be, would be</div><div><br></div><div><font face="monospace">a -> (b -> ([a] -> [b]))</font><br></div><div><br></div><div>without the parens <font face="monospace">(</font>which is a natural result of lambda calculus, perhaps?) -- which is not what is meant by <font face="monospace">map. </font>But underlying a Haskell type declaration is currying, is it not? At the type declaration level, it's all currying, correct?</div><div><br></div><div>Conceptually, I understand how the <font face="monospace">a -> b</font> "event" needs to be a "package" to apply to the list <font face="monospace">[a]</font>. The <font face="monospace">map</font> function commandeers the target function (which alone by itself does some <font face="monospace">a -> b</font> evaluation) to be a new object that is then applied to each member of list [a]. Good. So (a -> b) then is a notation that signifies this "package-ness".</div><div><br></div><div>Does anyone have examples of other "packaging" where a function doing some <font face="monospace">a -> b</font> is changed to <font face="monospace">(a -> b)</font> ?</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Dec 18, 2020 at 5:18 PM Bruno Barbier <<a href="mailto:brubar.cs@gmail.com">brubar.cs@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Hi Lawrence,<br>
<br>
Lawrence Bottorff <<a href="mailto:borgauf@gmail.com" target="_blank">borgauf@gmail.com</a>> writes:<br>
<br>
> Why is it not just<br>
><br>
> a -> b -> [a] -> [b]<br>
><br>
> again, why the parentheses?<br>
<br>
In Haskell, (->) is a binary operator and is right associative. If you write:<br>
<br>
   a -> b -> [a] -> [b]<br>
<br>
it implicitly means:<br>
<br>
   a -> (b -> ([a] -> [b]))<br>
<br>
So here, you need explicit parenthesis:<br>
<br>
   (a -> b) -> [a] -> [b]<br>
<br>
to mean:<br>
   (a -> b) -> ([a] -> [b])<br>
<br>
It's more about parsing binary operators than about types.<br>
<br>
Does it help ?<br>
<br>
Bruno<br>
<br>
> On Fri, Dec 18, 2020 at 4:10 PM Ut Primum <<a href="mailto:utprimum@gmail.com" target="_blank">utprimum@gmail.com</a>> wrote:<br>
><br>
>> Hi,<br>
>><br>
>> a -> b  is the type of a function taking arguments of a generic type (we<br>
>> call it a) and returning results of another type, that we call b.<br>
>><br>
>> So<br>
>> (a -> b ) -> [a] -> [b]<br>
>> Means that you have a first argument that is a function (a-> b),  a second<br>
>> argument that is a list of elements of the same type of the function input,<br>
>> and that the returned element is a list of things of the type of the output<br>
>> of the function.<br>
>><br>
>> Cheers,<br>
>> Ut<br>
>><br>
>> Il ven 18 dic 2020, 23:02 Lawrence Bottorff <<a href="mailto:borgauf@gmail.com" target="_blank">borgauf@gmail.com</a>> ha<br>
>> scritto:<br>
>><br>
>>> Thank you, but why in<br>
>>><br>
>>> map :: (a -> b) -> [a] -> [b]<br>
>>><br>
>>> are there parentheses around a -> b ? In general, what is the currying<br>
>>> aspect of this?<br>
>>><br>
>>><br>
>>> On Fri, Dec 18, 2020 at 12:43 PM David McBride <<a href="mailto:toad3k@gmail.com" target="_blank">toad3k@gmail.com</a>> wrote:<br>
>>><br>
>>>> They are not parameters, they are the types of the parameters.<br>
>>>><br>
>>>> In this case a can really be anything, Int, Char, whatever, so long as<br>
>>>> the function takes a single argument of that type and the list that is<br>
>>>> given has elements of that same type.<br>
>>>> It is the same for b, it doesn't matter what b ends up being, so long as<br>
>>>> when you call that function the function's return value is compatible with<br>
>>>> the element type of the list that you intended to return from the entire<br>
>>>> statement.<br>
>>>><br>
>>>> You can mess with it yourself in ghci to see how type inference works.<br>
>>>><br>
>>>> >:t show<br>
>>>> :show :: Show a => a -> String<br>
>>>> >:t map show<br>
>>>> map show :: Show a => [a] -> [String]<br>
>>>> > :t flip map [1::Int]<br>
>>>> > flip map [1::Int] :: (Int -> b) -> [b]<br>
>>>><br>
>>>><br>
>>>> On Fri, Dec 18, 2020 at 1:31 PM Lawrence Bottorff <<a href="mailto:borgauf@gmail.com" target="_blank">borgauf@gmail.com</a>><br>
>>>> wrote:<br>
>>>><br>
>>>>> I'm looking at this<br>
>>>>><br>
>>>>> ghci> :type map<br>
>>>>> map :: (a -> b) -> [a] -> [b]<br>
>>>>><br>
>>>>> and wondering what the (a -> b) part is about. map takes a function<br>
>>>>> and applies it to an incoming list. Good. Understood. I'm guessing that the<br>
>>>>> whole Haskell type declaration idea is based on currying, and I do<br>
>>>>> understand how the (a -> b) part "takes" an incoming list, [a] and<br>
>>>>> produces the [b] output. Also, I don't understand a and b very well<br>
>>>>> either. Typically, a is just a generic variable, then b is another<br>
>>>>> generic variable not necessarily the same as a. But how are they being<br>
>>>>> used in this type declaration?<br>
>>>>><br>
>>>>> LB<br>
>>>>> _______________________________________________<br>
>>>>> Beginners mailing list<br>
>>>>> <a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
>>>>> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
>>>>><br>
>>>> _______________________________________________<br>
>>>> Beginners mailing list<br>
>>>> <a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
>>>> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
>>>><br>
>>> _______________________________________________<br>
>>> Beginners mailing list<br>
>>> <a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
>>> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
>>><br>
>> _______________________________________________<br>
>> Beginners mailing list<br>
>> <a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
>> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
>><br>
> _______________________________________________<br>
> Beginners mailing list<br>
> <a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
</blockquote></div>