Monad 变压器 flatMap 工作
Monad transformer flatMap working
我一直在玩 monad transformer,我只创建了一个 Future[Option]。但是看了一些博客后,有些东西没有解释,我不明白。
在这里,在我的 map
和 flatMap
的实现中,在 flatMap
中,一旦我获得了我的选项的值,并且我将函数应用于该值,我必须调用函数 f(a)
the .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)
}))
}
那里发生了什么?它是如何工作的?。
此致。
What is happening there?
flatMap
希望你 return 它是 FutOpt[B]
:
def flatMap[B](f: A => FutOpt[B]): FutOpt[B]
您案例的签名class需要您传入一个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)
return 是 FutOpt[B]
,而不是 Future[Option[B]]
,这就是为什么它需要访问类型为 Future[Option[B]]
的 .future
。
我一直在玩 monad transformer,我只创建了一个 Future[Option]。但是看了一些博客后,有些东西没有解释,我不明白。
在这里,在我的 map
和 flatMap
的实现中,在 flatMap
中,一旦我获得了我的选项的值,并且我将函数应用于该值,我必须调用函数 f(a)
the .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)
}))
}
那里发生了什么?它是如何工作的?。
此致。
What is happening there?
flatMap
希望你 return 它是 FutOpt[B]
:
def flatMap[B](f: A => FutOpt[B]): FutOpt[B]
您案例的签名class需要您传入一个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)
return 是 FutOpt[B]
,而不是 Future[Option[B]]
,这就是为什么它需要访问类型为 Future[Option[B]]
的 .future
。