2017-07-10 1 views
-2

私はアクションの実行を強制的に強制して、IOアクションを得なければならない場所で、Control.Monad.Exceptを使用しています。なぜこれが必要なのか疑問に思っているのは、実行する必要のあるライブラリ関数がIOアクションのみを受け入れるためです。この場合は、Database.PostgreSQL.Simple.withTransaction :: Connection -> IO a -> IO a"IO(いずれかのea)をExceptTエマに変換する方法

次のものに相当します:

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

"期待される型:ExceptT AppError(ReaderT Env(LoggingT IO))a //実際の型:ExceptT AppError IO a' –

+0

この答えは間違っている、おそらくタイトルの質問が体の実際の質問。 –

+0

'PGS.withTransaction conn $ runAppM appm'は' IO(Either e a) 'と評価され、' ExceptT e m a'に変換する必要があります。ここに何が起こっているのか、私の理解に間隙がありますか? –

関連する問題