他の 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