如果其中一个选项失败(封装在List[Option[List[Double]]]
中),我想将Option[List[List[Double]]]
转换为None
,产生Future
。通常我应该可以使用Scalaz lib中的.sequence
。但是,当我遇到以下问题时:
val matrix = for {
listOfOptions <- futureListOfOptions
optionOfList <- listOfOptions.sequence
} yield optionOfList
matrix: Future[Nothing]
listOfOptions: scala.List[Option[scala.List[Double]]]
optionOfList: Any
我做错了什么?
答案 0 :(得分:2)
未来[列表[选项[列表[双]]] - &gt;
未来[列表[列表[双]]]
val x: Future[List[Option[List[Double]]]
val y: Future[List[List[Double]]] = x.map(_.flatten)
为什么需要将它包装在一个选项中? 只需映射列表,如果它没有元素,那么它就什么都不做。
答案 1 :(得分:2)
在使用sequence
时,您可能手动错过了一些导入或推断类型。如果您希望编译器为您试用,请使用sequenceU
。
这对我有用:
val start: List[Option[List[Double]]] = ???
import scalaz.std.option.optionInstance
import scalaz.std.list.listInstance
import scalaz.syntax.traverse._
val end: Option[List[List[Double]]] = start.sequenceU
完整示例:
val fstart: Future[List[Option[List[Double]]]] = ???
import scalaz.std.scalaFuture.futureInstance
val matrix = for {
lo ← fstart
ol = lo.sequenceU
} yield ol
答案 2 :(得分:-1)
你的意思是下面的吗?
cup