⬑
liftIO和lift的关系
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等操作的时候可以自动在需要的层级执行。