title: What is the difference between unsafeDupablePerformIO and accursedUnutterablePerformIO?
body: <p>I was wandering in the Restricted Section of the Haskell Library and found these two vile spells:</p>
  <pre><code>{- System.IO.Unsafe -}
  unsafeDupablePerformIO  :: IO a -&gt; a
  unsafeDupablePerformIO (IO m) = case runRW# m of (# _, a #) -&gt; a
  
  {- Data.ByteString.Internal -}
  accursedUnutterablePerformIO :: IO a -&gt; a
  accursedUnutterablePerformIO (IO m) = case m realWorld# of (# _, r #) -&gt; r
  </code></pre>
  <p>The actual difference seems to be just between <code>runRW#</code> and <code>($ realWorld#)</code>, however. I have some basic idea of what they are doing, but I don't get the real consequences of using one over another. Could somebody explain me what is the difference?</p>