2017-07-10 64 views
-2

我使用的是Control.Monad.Except,並且我被困在一個地方,在那裏我必須強制執行ExceptT AppError m a操作以獲取IO操作,然後將其包裝回來如果你想知道爲什麼這是必需的,這是因爲我需要運行的底層庫函數只接受IO操作,在這種情況下,它將是Database.PostgreSQL.Simple.withTransaction :: Connection -> IO a -> IO a如何將IO(ea)轉換爲ExceptT ema

如何編寫概念相當於以下內容:

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) 
+1

你的問題的標題和正文是完全不同的問題。 –

回答

-1

使用構造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

仍然給出一個錯誤:'Expected type:ExceptT AppError(ReaderT Env(LoggingT IO))a // Actual type:ExceptT AppError IO a' –

+0

這個答案是錯誤的,可能是因爲標題中的問題與真正的問題在體內。 –

+0

'PGS.withTransaction conn $ runAppM appm'的計算結果爲'IO(ea)',並且需要轉換爲'ExceptT e m a'。我對這裏發生的事情的理解有沒有差距? –

相關問題