【发布时间】:2017-07-10 08:20:06
【问题描述】:
我正在使用Control.Monad.Except 并被困在一个地方,我必须强制执行ExceptT AppError m a 操作以获得IO 操作,然后将其再次包装回ExceptT AppErr m a。如果您想知道为什么需要这样做,那是因为我需要运行的底层库函数只接受 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
这是我得到的错误:
Excepted type: ExceptT AppError (ReadertT Env (LoggingT IO)) a
Actual type: ExceptT AppError (ReadertT Env (LoggingT IO)) (Either AppError a)
【问题讨论】:
-
你问题的标题和正文是完全不同的问题。
标签: haskell monads monad-transformers