
Gregory Propf, Sat, 11 Aug 2007 13:06:43 -0700:
but the type of liftIO is baffling
class Monad m => MonadIO m where liftIO :: IO a -> m a
But how do you define this function? There is no constructor for "IO a" that you can "take apart".
If not using unsafePerformIO, which is usually not what we want, the monad m in question must incorporate IO. That is, it could be defined something like (say we want a parser with state): newtype IOParser tok s a = IOParser (s -> [tok] -> IO (s,a)) You can then define liftIO without “taking apart” the IO value; instead you put liftIO's IO action (IO a) into IOParser's IO action (IO (s,a)). Parsec does not define any such parser, though, so there's nothing for which you may define an instance of MonadIO. Malte