Haskell 如何转换一个";IO(e a)转换为例外e m a

Haskell 如何转换一个";IO(e a)转换为例外e m a,haskell,monads,monad-transformers,Haskell,Monads,Monad Transformers,我正在使用并且被困在一个地方,我必须强制执行一个ExceptT AppError ma操作以获得一个IO操作,然后将其重新包装成一个ExceptT apperrr ma。如果您想知道为什么需要这样做,那是因为我需要运行的底层库函数只接受IO操作。在这种情况下,它将是Database.PostgreSQL.Simple.withTransaction::Connection->IO a->IO a 如何编写以下概念等价物: type AppM = ExceptT AppError (ReaderT

我正在使用并且被困在一个地方,我必须强制执行一个
ExceptT AppError ma
操作以获得一个
IO
操作,然后将其重新包装成一个
ExceptT apperrr ma
。如果您想知道为什么需要这样做,那是因为我需要运行的底层库函数只接受IO操作。在这种情况下,它将是
Database.PostgreSQL.Simple.withTransaction::Connection->IO a->IO a

如何编写以下概念等价物:

type AppM = ExceptT AppError (ReaderT Env (LoggingT IO))

runAppM :: Env -> AppM a -> a

withTransaction :: AppM a -> AppM a
withTransaction appm = do
  conn <- getDbConnection
  env <- getEnv
  liftIO $ PGS.withTransaction conn $ runAppM appm

使用构造函数
ExceptT:m(e a)->ExceptT e m a

withTransaction :: AppM a -> AppM a
withTransaction appm = do
  conn <- getDbConnection
  env <- getEnv
  ExceptT $ PGS.withTransaction conn $ runAppM appm
withTransaction::AppM a->AppM a
withTransaction appm=do

conn仍然给出错误:
预期类型:ExceptT AppError(ReaderT Env(logging IO))a//实际类型:ExceptT AppError IO a
此答案是错误的,可能是因为标题中的问题与正文中的实际问题不同。
PGS.withTransaction conn$runAppM appm
计算为
IO(e或a)
并且需要将其转换为除e m a之外的
。我对这里发生的事情的理解有差距吗?我明白了<代码>不包括$liftIO$PGS.withTransaction conn$runAppM appm
是正确的
liftIO
IO(ea)
提升到
ReaderT Env(logging IO)(ea)
,然后
ExceptT
将其提升到
AppM a
问题的标题和主体是完全不同的问题。
withTransaction :: AppM a -> AppM a
withTransaction appm = do
  conn <- getDbConnection
  env <- getEnv
  ExceptT $ PGS.withTransaction conn $ runAppM appm