ダブルネストにはダブルマッピングが必要です。したがって、バニラスケーラでは、何をしているのが正しいのですか。 、我々は第二のための理論を考慮すれば
はしかし、List
とFuture
の両方がmap
操作を持っており、これは彼らFunctors
(これは単純化しすぎですが、私と一緒にクマ)
二Functors
は、一般的に構成することができますFunctor
がFuture
で、Functor
がList
の場合は、「結合」map
操作を実装できます。
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import cats._
import cats.std.future._
import cats.std.list._
// create a `Functor[Future[List]`
val futureListF = Functor[Future].compose(Functor[List])
val data = Future.successful(List(1, 2, 3))
// only one map!
futureListF.map(data)(_.toString) // Future(List("1", "2", "3"))
そしてもちろん、あなたがOption
と同じ操作を行うことができます。ここでは
はcats
を使った例です。
val futureOptionF = Functor[Future].compose(Functor[Option])
val data = Future.successful(Option(42))
futureOptionF.map(data)(_.toString) // Future(Some("42"))
ボーナスは、あなたは、ネストの深さに関係なく、同じ技術を使用することができます。
type ListOption[+A] = List[Option[A]]
implicit val listOptionF = Functor[List].compose(Functor[Option])
val futureListOptionF = Functor[Future].compose(Functor[ListOption])
// the above three lines could just be
// val futureListOptionF = Functor[Future].compose(Functor[List].compose(Functor[Option]))
// if only SI-2712 were fixed
val data = Future.successful(List(Some(42), None, Some(2)))
// triple nesting? Still a single map!
futureListOptionF.map(data)(_.toString) // Future(List(Some("42"), None, Some("2")))
オプションは、マップ・メソッドを持っているので、あなたは(私がすべきだと思う)と同じ方法で変換を行うことができますSeqのためにそれをしました。 –