title: <*> for lists implemented as do notation - isn't this "cheating"?
body: <p>According to 'Learn you a Haskell', the implementation of <code>&lt;*&gt;</code> for lists is:</p>
  
  <pre><code>fs &lt;*&gt; xs = [f x | f &lt;- fs, x &lt;- xs]
  </code></pre>
  
  <p>Am I mistaken, or is this sugared monadic code based on <code>&gt;&gt;=</code> ?</p>
  
  <p>As far as I understand, it should be possible to implement &lt;*> only using <code>fmap</code>, as it is the case with applicative Maybe.</p>
  
  <p>How could <code>&lt;*&gt;</code> for lists be implemented only using <code>fmap</code>? (and possibly without concat-ing things?)</p>
  
  <p>BTW, a few pages later I see the same issue with regards to the implementation of <code>&lt;*&gt;</code> for applicative <code>IO</code>.</p>