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