1

他の API とやり取りし、何らかの処理を行った後に応答を保存する単純な Web サーバーを実装しようとしています。

失敗の可能性 (空の応答、誤った要求など) をカプセル化するために、ExceptT次のように使用しています。

getExample
  :: (MonadIO m, MonadReader ApplicationConfig m)
  => ExceptT ApplicationError m [Example]
getExample = do

  partOfReq <- asks requestForSometing

  fn1 =<< fn2 partOfReq

また、Persistent のinsertMany_を使用して応答をデータベースに格納する別の関数があります。

storeExample
  :: ( MonadIO m
     , PersistStoreWrite backend
     , PersistEntityBackend Example ~ BaseBackend backend
     )
  => [Example]
  -> ReaderT backend m ()
storeExample = insertMany_

今私は関数を書きたい

getResponseAndStore = ... {- A combination of getExample and storeExample -}

これらの両方を実行し、ユーザーがバンドルでそれらを提供できる上部に要件をバブルアップApplicationConfigします。PersistEntityBackend

それは可能でしょうか?

もしそうなら - 戦略/実装はどうなりますか?

いいえの場合 - どのような変更を検討する必要がありますか?

編集:これは私が現在行っていることです。

getResponseAndStore
  :: ( MonadIO m
     , MonadReader ApplicationConfig m
     , PersistStoreWrite backend
     , PersistEntityBackend Example ~ BaseBackend backend
     )
  => ReaderT backend (ExceptT ApplicationError m) ()
getResponseAndStore = storeExample =<< lift getExample
4

2 に答える 2