在本文档中,我们在eval6中调用liftIO来执行I / O操作。 在这种情况下,为什么我们需要解除?因为没有IO类 我们可以将类型实例化为。因此,对于I / O操作,我们 必须调用lift才能向内发送命令。对于eval6,我们会 需要组合电梯四次打印东西。这只是 不方便,所以人们创建了一个新类MonadIO,这样我们才有 需要调用一次liftIO,而不必计算多少 构成电梯的时间:
class (Monad m) => MonadIO m where
liftIO :: IO a -> m a
instance MonadIO IO where
liftIO = id
instance (Error e, MonadIO m) => MonadIO (ErrorT e m) where
liftIO = lift . liftIO
instance (MonadIO m) => MonadIO (ReaderT r m) where
liftIO = lift . liftIO
引文来自http://www.cs.virginia.edu/~wh5a/personal/Transformers.pdf
再一次,我无法理解为什么我们需要四次调用liftIO。我无法看到它因此请说清楚;)