我创建了这个简单的Monad Transformer
type FutureOptionInt = OptionT[Future, Int]
现在我可以通过
轻松创建此实例1.pure[FutureOptionInt]
这很好。但我有另一个功能,它返回一个Future [Option [Int]]。我无法将此功能的输出更改为MT
所以我需要将返回类型分配给我的MT。
我试过
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]?
答案 0 :(得分:1)
您可以使用隐式转换来执行此操作:
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