Scala中,Future[Option[A]]如何进行类型转换?

In Scala, how to do type conversion for Future[Option[A]]?

例如有两个类:ABA 中有一个方法叫做 toB.

现在有一个 a 类型的值 Future[Option[A]],将其转换为 Future[Option[B]] 的最优雅方法是什么?

目前我正在使用 a.map(_.map(_.toB)),但我认为它看起来有点笨拙和混乱。有没有人有更好的方法来做到这一点? (隐式转换) 谢谢!

如果您需要对Future[Option[?]]的"stack"进行大量操作,您可以使用monad transformer:

val a: OptionT[Future, A] = OptionT(...)
val b: OptionT[Future, B] = a.map(_.toB)

如果您愿意在其中添加一些 scalaz,您可以为此编写一个通用函数:

 import scalaz._
 import Scalaz._

def mapF[F[_]: Functor, G[_]:Functor,A,B](fg: F[G[A]], h : A => B) : F[G[B]] =  fg.map( _.map(h))

它使用 "ugly" mapmap 版本,但它适用于任何 Functor。 如果你想使用它中缀,只需为它创建一个隐式 class:

  implicit class toMapF[F[_]:Functor,G[_]:Functor, A](fg : F[G[A]]){
    def mapF[B](f: A => B) = fg.map( _.map(f))
  }

然后你可以像这样使用它:

 a.mapF(_.toB)

这当然是绝对矫枉过正,除非您已经在使用 scalaz,但任何理由都值得尝试一下。