Scala 当存在';一个IO卡在中间 我想写一个基本的DOBIE读/写事务,但是KEKER是在中间有一个 IO < /代码>返回调用。我想这样做: abstract class MyDAO { def readSomething(id: String): ConnectionIO[Option[Something]] def writeSomething(something: Something): ConnectionIO[Unit] } class MyService { def getNewSomething: IO[Something] = ??? } class MyProgram(myDAO: MyDAO, myService: MyService, xa: DataSourceTransactor[IO]) { val transaction = myDAO.readSomething("xyz").flatMap { case Some(thing) => IO.pure(thing).pure[ConnectionIO] //ConnectionIO[IO[Something]] case None => myService.getNewSomething.map { newSomething => myDAO.writeSomething(newSomething).map(_ => newSomething) }.sequence[ConnectionIO, Something] //can't sequence an IO! So I'm stuck with IO[ConnectionIO[Something]] } transaction.transact(xa) } import cats.effect._ import doobie._ import doobie.implicits._ def read: ConnectionIO[Int] = ??? def write(s: String): ConnectionIO[Unit] = ??? def transform(i: Int): IO[String] = ??? val transaction: ConnectionIO[Unit] = for { i <- read s <- transform(i).to[ConnectionIO] _ <- write(s) } yield () transaction.transact(xa)
但是我不能在Scala 当存在';一个IO卡在中间 我想写一个基本的DOBIE读/写事务,但是KEKER是在中间有一个 IO < /代码>返回调用。我想这样做: abstract class MyDAO { def readSomething(id: String): ConnectionIO[Option[Something]] def writeSomething(something: Something): ConnectionIO[Unit] } class MyService { def getNewSomething: IO[Something] = ??? } class MyProgram(myDAO: MyDAO, myService: MyService, xa: DataSourceTransactor[IO]) { val transaction = myDAO.readSomething("xyz").flatMap { case Some(thing) => IO.pure(thing).pure[ConnectionIO] //ConnectionIO[IO[Something]] case None => myService.getNewSomething.map { newSomething => myDAO.writeSomething(newSomething).map(_ => newSomething) }.sequence[ConnectionIO, Something] //can't sequence an IO! So I'm stuck with IO[ConnectionIO[Something]] } transaction.transact(xa) } import cats.effect._ import doobie._ import doobie.implicits._ def read: ConnectionIO[Int] = ??? def write(s: String): ConnectionIO[Unit] = ??? def transform(i: Int): IO[String] = ??? val transaction: ConnectionIO[Unit] = for { i <- read s <- transform(i).to[ConnectionIO] _ <- write(s) } yield () transaction.transact(xa),scala,scala-cats,doobie,cats-effect,Scala,Scala Cats,Doobie,Cats Effect,但是我不能在IO上排序。因此,在第二种情况下,我将使用IO[ConnectionIO[Something]],这意味着我的事务最终将类似于ConnectionIO[IO[ConnectionIO[Something] 我想要的是一个ConnectionIO[IO[Something]],然后我可以在一个事务中运行它,生成IO[IO[Something],然后我可以轻松地将其展平。(我不想运行IO)有意义吗?你知道这是否可行吗?理论上,你可以使用cats effect提供的LiftIO类型类,由d
IO
上排序。因此,在第二种情况下,我将使用IO[ConnectionIO[Something]]
,这意味着我的事务最终将类似于ConnectionIO[IO[ConnectionIO[Something]
我想要的是一个
ConnectionIO[IO[Something]]
,然后我可以在一个事务中运行它,生成IO[IO[Something]
,然后我可以轻松地将其展平。(我不想运行IO
)有意义吗?你知道这是否可行吗?理论上,你可以使用cats effect
提供的LiftIO
类型类,由doobie实现如下:
abstract class MyDAO {
def readSomething(id: String): ConnectionIO[Option[Something]]
def writeSomething(something: Something): ConnectionIO[Unit]
}
class MyService {
def getNewSomething: IO[Something] = ???
}
class MyProgram(myDAO: MyDAO, myService: MyService, xa: DataSourceTransactor[IO]) {
val transaction = myDAO.readSomething("xyz").flatMap {
case Some(thing) => IO.pure(thing).pure[ConnectionIO] //ConnectionIO[IO[Something]]
case None => myService.getNewSomething.map { newSomething =>
myDAO.writeSomething(newSomething).map(_ => newSomething)
}.sequence[ConnectionIO, Something] //can't sequence an IO! So I'm stuck with IO[ConnectionIO[Something]]
}
transaction.transact(xa)
}
import cats.effect._
import doobie._
import doobie.implicits._
def read: ConnectionIO[Int] = ???
def write(s: String): ConnectionIO[Unit] = ???
def transform(i: Int): IO[String] = ???
val transaction: ConnectionIO[Unit] = for {
i <- read
s <- transform(i).to[ConnectionIO]
_ <- write(s)
} yield ()
transaction.transact(xa)