We're hitting something that looks similar with a Chan on 7.2.1, though they might be related..

On Fri, Nov 11, 2011 at 4:52 AM, Simon Marlow <marlowsd@gmail.com> wrote:
Sorry, no.  That one has a workaround: define your own fixIO:

fixIO :: (a -> IO a) -> IO a
fixIO k = do
   m <- newEmptyMVar
   ans <- unsafeInterleaveIO (takeMVar m)
   result <- k ans
   putMVar m result
   return result