我正在尝试实现一个简单的 Web 服务器,它与其他一些 API 交互并在进行一些处理后存储响应。
为了封装失败的可能性(空响应、错误请求等),我使用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