title: How do I derive the type for this function:
body: <p>I'm trying to get better at playing "type tetris". I have the functions:</p>
  
  <pre><code>(=&lt;&lt;) :: Monad m =&gt; (a -&gt; m b) -&gt; m a -&gt; m b
  zip :: [a] -&gt; [b] -&gt; [(a, b)]
  </code></pre>
  
  <p>And GHCi tells me:</p>
  
  <pre><code>(zip =&lt;&lt;) :: ([b] -&gt; [a]) -&gt; [b] -&gt; [(a, b)]
  </code></pre>
  
  <p>I'm having a hard time figuring out how to arrive at that final signature from the first two. My intuition (for lack of a better word) is saying that the first argument of <code>=&lt;&lt;</code> namely <code>a -&gt; mb</code> is somehow reconciled against the signature of <code>zip</code>, and then it should all fall out from that. But I can't understand how to make that leap. Can it be broken down in to a series of easy to follow steps?</p>