On Wed, Nov 16, 2005 at 09:45:17AM -0800, Andrew Pimlott wrote: > On Wed, Nov 16, 2005 at 11:51:19AM -0500, Kurt Hutchinson wrote: > > I have to perform another runReaderT when forking? Or is there a way > > to get the ReaderT environment automatically carried over to the newly > > created Set B thread? > > This is an unavoidable pain as far as I know. It would be nice if > forkIO were defined in terms of MonadIO: > > forkIO :: MonadIO m => m () -> m ThreadId > > (Same with forkProcess.) I haven't thought too hard about it, but it > seems that it should be possible.
I think it wouldn't be possible using only methods in MonadIO. Besides, what should be the semantics of forkIO for (StateT s IO)? I can't think of anything reasonable. I played with this idea a bit, and below is the result. I'm not sure there are any meaningful instances of UnliftIO (bad name) other than the two below. class Monad m => UnliftIO m where unliftIO :: m a -> m (IO a) instance UnliftIO IO where unliftIO io = return io instance UnliftIO m => UnliftIO (ReaderT r m) where unliftIO m = do r <- ask lift (unliftIO (runReaderT m r)) forkIO' :: (UnliftIO m, MonadIO m) => m () -> m ThreadId forkIO' m = do io <- unliftIO m liftIO (forkIO io) Best regards Tomasz _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe