理论上你可以使用
LiftIO
typeclass由提供
cats-effect
由doobie实施如下:
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)
注意
to[ConnectionIO]
. 它接受类型为的隐式参数
它看起来像这样,并且做了你想做的事情
IO
进入
F
):
trait LiftIO[F[_]] {
def liftIO[A](ioa: IO[A]): F[A]
}