我正在尝试通过与Doobie将用户插入数据库相同的事务发送电子邮件。
我知道我可以通过使用whereIO
进入,但是在我的代码中,我没有对其进行操作,例如,我使用了约束,因此我可以用自己的monad进行测试。ConnectionIO
Async[ConnectionIO].liftIO(catsIO)
catsIO: IO[String]
IO
F
F[_]: Async
F
是否可以以某种方式直接F[String]
进入ConnectionIO[String]
而不使用IO
类型?
这是我针对IO类型找到的答案:1次事务中的Doobie和DB访问组成
猫有一个叫做FunctionK的东西,这是自然的转变。
我这样做:
在一切都已建立的世界之巅,您将需要
val liftToConnIO: FunctionK[IO, ConnectionIO] = LiftIO.liftK[ConnectionIO]
在需要从F [String]转换为G [String]的类中(当您构建所有内容时,F将为IO,G将为ConnectionIO),您可以传递liftToConnIO
并使用它在需要的地方将F [A]转换为G [A] 。
不想通过IO和ConnectionIO抽象的类可以通过FunctionK进行提升:
class Stuff[F[_], G[_]](emailer: Emailer[F], store: Store[G], liftToG: FunctionK[F, G]) {
def sendEmail: G[Unit] =
for {
_ <- doDatabaseThingsReturnStuffInG
_ <- liftToG(emailer.sendEmail)
_ <- doMoreDatabaseThingsReturnStuffInG
} yield ()
}
(您可能需要在F和G上使用上下文范围(同步?))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句