
Hi all. Under I have some old code that broke under ghc 6.10.1. Under (6.6.1), 6.8.1 (and I think 6.8.2), this compiles. import Prelude hiding(catch) import Control.Concurrent import Control.Exception(catch,throw,evaluate) async :: IO a -> IO (MVar a) async ioa = do mVar <- newEmptyMVar forkIO $ catch (ioa >>= putMVar mVar) (putMVar mVar . throw) return mVar Under 6.10. I now get a type error. TypeError.hs:13:55: Ambiguous type variable `e' in the constraint: `GHC.Exception.Exception e' arising from a use of `throw' at TypeError.hs:13:55-59 Probable fix: add a type signature that fixes these type variable(s) Prelude> :t catch catch :: IO a -> (IOError -> IO a) -> IO a Prelude> :t Control.Exception.catch Control.Exception.catch :: (GHC.Exception.Exception e) => IO a -> (e -> IO a) -> IO a What changed that causes this to break between 6.8 and 6.10? In fact, I don't even see the type error (the message is of little help). The function throw returns an `a', so it should unify with the required type for the handler. I tried simplifying the problematic line to: forkIO $ catch (ioa >>= putMVar mVar) (error "boom") (error "boom") should also unify with anything. Can anyone suggest other things I can try and perhaps what is going on? Thanks, - Tim