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)