<div dir="ltr">It's all clear as day.<br><br>Thanks<br></div><br><div class="gmail_quote"><div dir="ltr">On Tue, 12 Jun 2018 at 19:35 Ut Primum <<a href="mailto:utprimum@gmail.com">utprimum@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi,<div>as you probably know, fmap ha type </div><div>fmap :: Functor f => (a -> b) -> f a -> f b</div><div><div>So, you can see fmap as a unary funcrion that takes an argument of type (a->b) and returns a result of type (f a -> f b).</div><div><br></div><div>For example, if you define</div><div>identity x = x</div><div>then </div><div>fmap identity :: Functor f => f b -> f b</div><div>(here a = b because identity :: p -> p )</div><div><br></div><div>Now, the type of (.) is;</div><div><div>(.) :: (b -> c) -> (a -> b) -> (a -> c)</div></div><div><br></div><div>if you write 

<span style="font-size:12.8px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">fmap . fmap, in general (a priori) the type of the fmaps could be</span></div><div><span style="font-size:12.8px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">FIRSTFMAP                 fmap :: Functor f1 => (d -> e) -> f1 d -> f1 e</span></div><div><span style="font-size:12.8px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">SECONDFMAP            fmap :: Functor f2 => (g -> h) -> f2 g -> f2 h</span></div><div><span style="font-size:12.8px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br></span></div><div><span style="font-size:12.8px">let's see if there must be some bonds between types d,e,g,h, due to the type of (.)</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">(b -> c) = FIRSTFMAP (the first argument of (.) )</span></div><div><span style="font-size:12.8px">(a -> b) = SECONDFMAP 

<span style="background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">(the second argument of (.) )</span>

</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">so, we have (I'll not write "Functor f1" or "Functor f2", we know f1 and f2 are functors)</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">b = (d -> e)</span></div><div><span style="font-size:12.8px">c = (f1 d -> f1 e)</span></div><div><span style="font-size:12.8px">a = (g -> h)</span></div><div><span style="font-size:12.8px">b = (f2 g -> f2 h)</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">now, it must be b=b, so the type (</span><span style="font-size:12.8px">d -> e) </span><span style="font-size:12.8px">must be the same type of (</span><span style="font-size:12.8px">f2 g -> f2 h)</span></div><div><span style="font-size:12.8px">So </span></div><div><span style="font-size:12.8px">d = f2 g</span></div><div><span style="font-size:12.8px">e = f2 h</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">The result of  </span>fmap . fmap, will be of type (a -> c) that is </div></div><div>(g -> h) -> (f1 d -> f1 e) = (g -> h) -> f1 d -> f1 e</div><div>that, remebering the conditions on d and e, is</div><div>(g -> h) -> f1 (f2 g) -> f1 (f2 h)</div><div><br></div><div>which is the type you found on the book</div><div>(you only need to add that f1, f2 are Functors, and the names of f and g can of course be replaced with a and b)</div><div><br></div><div>Cheers,</div><div>Ut</div></div><div class="gmail_extra"><br><div class="gmail_quote"></div></div><div class="gmail_extra"><div class="gmail_quote">2018-06-12 18:12 GMT+02:00 Marco Turchetto <span dir="ltr"><<a href="mailto:marco.turchetto.mt@gmail.com" target="_blank">marco.turchetto.mt@gmail.com</a>></span>:<br></div></div><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I'm reading the "Haskell programming" book and in chapter 16 about functors they combine two "fmap" with the "(.)" function.<div>I really don't understand how the type of "fmap . fmap" is "(Functor f2, Functor f1) => (a -> b) -> f1 (f2 a) -> f1 (f2 b)".</div><div><br></div><div>The thing that really freaks me out is that I thought that "(.)" arguments are ONLY two unary function.</div><div>Maybe there is some curring magic underline, there is someone that can explain to me how the type of "<span class="m_-4267157721207224011m_-2254964728201686128inbox-inbox-gr_ m_-4267157721207224011m_-2254964728201686128inbox-inbox-gr_271 m_-4267157721207224011m_-2254964728201686128inbox-inbox-gr-alert m_-4267157721207224011m_-2254964728201686128inbox-inbox-gr_gramm m_-4267157721207224011m_-2254964728201686128inbox-inbox-gr_inline_cards m_-4267157721207224011m_-2254964728201686128inbox-inbox-gr_run_anim m_-4267157721207224011m_-2254964728201686128inbox-inbox-Style m_-4267157721207224011m_-2254964728201686128inbox-inbox-multiReplace" id="m_-4267157721207224011m_-2254964728201686128inbox-inbox-271" style="display:inline;border-bottom:2px solid transparent;background-repeat:no-repeat"><span class="m_-4267157721207224011m_-2254964728201686128inbox-inbox-gr_ m_-4267157721207224011m_-2254964728201686128inbox-inbox-gr_261 m_-4267157721207224011m_-2254964728201686128inbox-inbox-gr-alert m_-4267157721207224011m_-2254964728201686128inbox-inbox-gr_spell m_-4267157721207224011m_-2254964728201686128inbox-inbox-gr_inline_cards m_-4267157721207224011m_-2254964728201686128inbox-inbox-gr_disable_anim_appear m_-4267157721207224011m_-2254964728201686128inbox-inbox-ContextualSpelling m_-4267157721207224011m_-2254964728201686128inbox-inbox-ins-del m_-4267157721207224011m_-2254964728201686128inbox-inbox-multiReplace" id="m_-4267157721207224011m_-2254964728201686128inbox-inbox-261" style="display:inline;border-bottom:2px solid transparent;background-repeat:no-repeat;color:inherit;font-size:inherit">fmap</span> .</span> <span class="m_-4267157721207224011m_-2254964728201686128inbox-inbox-gr_ m_-4267157721207224011m_-2254964728201686128inbox-inbox-gr_276 m_-4267157721207224011m_-2254964728201686128inbox-inbox-gr-alert m_-4267157721207224011m_-2254964728201686128inbox-inbox-gr_spell m_-4267157721207224011m_-2254964728201686128inbox-inbox-gr_inline_cards m_-4267157721207224011m_-2254964728201686128inbox-inbox-gr_run_anim m_-4267157721207224011m_-2254964728201686128inbox-inbox-ContextualSpelling m_-4267157721207224011m_-2254964728201686128inbox-inbox-ins-del m_-4267157721207224011m_-2254964728201686128inbox-inbox-multiReplace" id="m_-4267157721207224011m_-2254964728201686128inbox-inbox-276" style="display:inline;border-bottom:2px solid transparent;background-repeat:no-repeat">fmap</span>" is derived from the type of "fmap" and "(.)"?<br></div><br class="m_-4267157721207224011m_-2254964728201686128inbox-inbox-Apple-interchange-newline"></div>
<br></blockquote></div></div><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">_______________________________________________<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></blockquote></div><br></div>
_______________________________________________<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>