liftIO和lift的关系

#Haskell

Haskell中monad transformer常常嵌套,例如:

type App a = ReaderT AppConfig (StateT AppState IO) a

其中,每一层(ReaderT、StateT、…)都实现了MonadIO类。

因此,App可以直接deriving MonadIO。

然后,liftIO功能等价于多个嵌套的lift。

例如WriterT的liftIO实现:

instance (Monoid w, MonadIO m) => MonadIO (WriterT w m) where
    liftIO = lift . liftIO

同理,MonadReader、MonadState、MonadWriter也可以直接deriving,执行ask、tell等操作的时候可以自动在需要的层级执行。