如何将 Future[Option[Int]] 分配给 OptionT[Future, Int]

How to assign a Future[Option[Int]] to a OptionT[Future, Int]

我创建了这个简单的 Monad Transformer

type FutureOptionInt = OptionT[Future, Int]

现在我可以通过

轻松创建一个实例
1.pure[FutureOptionInt]

这很好。但我还有另一个功能,它 return 给我一个 Future[Option[Int]]。我无法将此函数的输出更改为 MT

所以我需要为我的 MT 分配 return 类型。

我试过了

val y = Future(Option(1))
val x : FutureOptionInt = y

但我收到错误

cmd5.sc:1: type mismatch;
 found   : scala.concurrent.Future[Some[Int]]
 required: $sess.cmd3.FutureOption
    (which expands to)  cats.data.OptionT[scala.concurrent.Future,Int]
val x : FutureOption = y

所以问题是,如果你有一个 Future[Option[Int]],你如何将它分配给 OptionT[Future, Int]?

您可以使用隐式转换来执行此操作:

implicit def toTransformer(future: Future[Option[Int]]) = OptionT(future)

那么你的作业就成功了。

将选项中的内容抽象如下可能对您也很有用,这样您就不必编写大量转换器:

implicit def toTransformer[T](future: Future[Option[T]]) = OptionT(future)

type FutureOpt[T] = OptionT[Future, T]

val intOpt = Future(Option(1))
val strOpt = Future(Option(""))

val x : FutureOpt[Int] = intOpt
val y : FutureOpt[String] = strOpt