Monad变压器flatMap工作

时间:2017-11-06 08:41:09

标签: scala monads scalaz monad-transformers scala-cats

我一直在玩monad变压器,我只创建了一个Future [Option]。但在阅读了一些博客后,有些内容没有解释,我也不明白。

在我的mapflatMap的实现中,在flatMap中我获得了我的选项的值,并且我将该函数应用于值,我必须调用函数f(a)Value_passed_in_the_case_class(in this case future)

case class FutOpt[A](future: Future[Option[A]]) {

def map[B](f: A => B): FutOpt[B] = {
  FutOpt(future.map(option => option.map(value => f(value)))
    .recoverWith {
      case e: Exception =>
        Future.successful(Option.empty)
    })
}

def flatMap[B](f: A => FutOpt[B]): FutOpt[B] =
  FutOpt(future.flatMap(option => option match {
    case Some(a) => f(a).future  --> WHAT THIS .future IS DOING?
    case None => Future.successful(None)
  }))
}

那里发生了什么?,以及如何运作?

问候。

1 个答案:

答案 0 :(得分:1)

  

那里发生了什么?

flatMap希望您将其返回FutOpt[B]

def flatMap[B](f: A => FutOpt[B]): FutOpt[B]

您的案例类的签名要求您传递Future[Option[A]]

case class FutOpt[A](future: Future[Option[A]])

这行代码:

FutOpt(future.flatMap(option => option match {
    case Some(a) => f(a).future

构建FutOpt[B]的新实例,并且需要类型为Future[Option[B]]的值,以便能够正确构建自己。 f(a)会返回FutOpt[B],而不是Future[Option[B]],这就是为什么它需要访问类型为.future的{​​{1}}。