雙層嵌套需要雙映射,所以是的,在香草scala中,你所做的是正確的。
然而,如果我們考慮到理論了一秒鐘,兩List
和Future
有map
操作,這使得他們Functors
(這是一個過於簡單化,但包涵)
兩個Functors
一般可以組成,因此您可以編寫的Future
和Functor
的List
以實施「聯合」操作。
下面是一個使用cats
一個例子:
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
。
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完成了。 –