2017-07-10 4 views
-2

J'utilise Control.Monad.Except et je suis coincé dans un endroit où je dois forcer l'exécution d'une action ExceptT AppError m a pour obtenir une action IO, puis l'envelopper de retour Si vous vous demandez pourquoi cela est nécessaire, c'est parce que la fonction de la bibliothèque sous-jacente que je dois exécuter n'accepte que l'action E/S Database.PostgreSQL.Simple.withTransaction :: Connection -> IO a -> IO aComment convertir un « IO (soit ea) dans un ExceptT ema

Comment écrire le conceptuel équivalent du suivant:

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 

Voici l'erreur que je reçois:

Excepted type: ExceptT AppError (ReadertT Env (LoggingT IO)) a 
Actual type: ExceptT AppError (ReadertT Env (LoggingT IO)) (Either AppError a) 
+1

Le titre et le corps de votre question sont des questions complètement différentes. –

Répondre

-1

Utilisez le constructeur ExceptT : m (Either e a) -> ExceptT e m a

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

Toujours une erreur: 'Type attendu: ExceptT AppError (ReaderT Env (LoggingT IO)) a // Type réel: ExceptT AppError IO a' –

+0

Cette réponse est fausse, sans doute parce que la question dans le titre n'est pas la même que la question réelle dans le corps. –

+0

'PGS.withTransaction conn $ runAppM appm' évalue à' IO (Either e a) 'et il doit être converti en' ExceptT e ​​m a'. Y a-t-il un écart dans ma compréhension de ce qui se passe ici? –