title: What are the consequences of returning an IO action?
body: <p>In Haskell, the type constructor <code>IO</code> is a monad equipped with a <code>return</code> statement that lifts any expression to its <code>IO</code> version.</p>
  
  <p>Nothing prevents us from lifting what is already an <code>IO</code> action to its <code>IO</code> version - giving us a type of the form <code>IO (IO a)</code>.</p>
  
  <p>So I can for example write the following program:</p>
  
  <pre><code>main = return . print $ "Hello world"
  </code></pre>
  
  <p>Which upon execution does exactly nothing.</p>
  
  <p>My question is, what happens under the hood when this main is executed?</p>
  
  <p>Are there any situations where it makes sense to <code>return</code> an IO action?</p>