title: What are the semantics of "strict returns"?
body: <p>In the <a href="http://www.haskell.org/haskellwiki/Performance" rel="nofollow">Haskell Performance Resource</a> wiki-section, the not further explained recommendation is given to</p>
  
  <blockquote>
    <ul>
    <li>Use strict returns (<code>return $! ...</code>) unless you absolutely need them lazy. </li>
    </ul>
  </blockquote>
  
  <p>Why is that a good thing to do? When exactly is the <code>...</code>-expression (Whnf-)forced?</p>
  
  <p>Given the "Left identity" monad-law and the definition</p>
  
  <pre><code>f $! x = x `seq` f x
  </code></pre>
  
  <p>I can rewrite (in <code>do</code>-notation`):</p>
  
  <pre><code>do x' &lt;- return $! x
     f x'
  </code></pre>
  
  <p>to</p>
  
  <pre><code>do x' &lt;- x `seq` return x
     f x'
  </code></pre>
  
  <p>But it seems I can't get to</p>
  
  <pre><code>do f $! x
  </code></pre>
  
  <p>PS: If the <code>BangPatterns</code>-extension is available, is</p>
  
  <pre><code>do !x' &lt;- return x
     f x'
  </code></pre>
  
  <p>semantically the same as the first <code>do</code>-expression given above?</p>