【问题标题】:Monad transformer flatMap workingMonad 变压器 flatMap 工作
【发布时间】:2018-04-18 08:54:17
【问题描述】:

我一直在玩 monad 转换器,我只创建了一个 Future[Option]。但是在阅读了一些博客之后,有些东西没有解释,我不明白。

在我的mapflatMap 的实现中,在flatMap 中,一旦我获得了我的选项的值,并且我将函数应用于值,我必须调用函数@987654324 @.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)
  }))
}

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

问候。

【问题讨论】:

  • .future 只是访问您在case class FutOpt[A](future: Future[Option[A]]) 中定义的字段
  • 是的,我明白了,但为什么需要访问该字段?

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


【解决方案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,它的类型是Future[Option[B]]

【讨论】:

  • 正确的耶稣我太瞎了!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多