title: Haskell: do notation and return in Monads
body: <p>Suppose I have following code</p>
  
  <pre><code>do {x &lt;- (Just 3); y &lt;- (Just 5); return (x:y:[])}
  </code></pre>
  
  <p>Which outputs <code>Just [3,5]</code></p>
  
  <p>How does haskell know that output value should be in <code>Maybe</code> monad? I mean <code>return</code> could output <code>[[3, 5]]</code>. </p>