我需要做些什么来移植 ReactiveMongo scala 才能使用猫效果?

High level of what I will need to do to port ReactiveMongo scala to use cats effects?

如果我想在 http4s 之类的东西中使用 ReactiveMongo,我将不得不将 ReactiveMongo returns 的所有 Future 调用包装在 Cats IO 效果中,这样说是否正确?

在高层次上,将 ReactiveMongo 合并到 http4s 中需要哪些步骤?

Cats Effect 提供 Async 类型类,可让您将一些回调(例如 Future 的 onComplete)转换为 F。一个 example from documentation:

import cats.effect.{IO, Async}

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future

val apiCall = Future.successful("I come from the Future!")

val ioa: IO[String] =
  Async[IO].async { cb =>
    import scala.util.{Failure, Success}

    apiCall.onComplete {
      case Success(value) => cb(Right(value))
      case Failure(error) => cb(Left(error))
    }
 }

ioa.unsafeRunSync()

实际上,Async[F] evan 有一个方法允许将 Future 提升为异步:Async[F].fromFuture(Sync[F].defer(future))Future 包装在 IO 中,因为它的创建是有副作用的,并触发急切的计算).

但是,如果您固定使用 cats.effect.IO,您可以简单地使用 IO.fromFuture(IO(future))

你必须在任何需要将 Future 转换为 IO(或其他 F)的地方使用它(或一些委托给它的实用程序)。