Scalaz 中的 Future[List[Option[List[Double]]] 到 Future[Option[List[List[Double]]]
Future[List[Option[List[Double]]] to Future[Option[List[List[Double]]] in Scalaz
我想将 List[Option[List[Double]]]
转换为 Option[List[List[Double]]]
,如果其中一个选项失败(封装在 Future
中),则生成 None
。通常我应该能够使用 Scalaz 库中的 .sequence
。但是,当我遇到以下问题时:
val matrix = for {
listOfOptions <- futureListOfOptions
optionOfList <- listOfOptions.sequence
} yield optionOfList
matrix: Future[Nothing]
listOfOptions: scala.List[Option[scala.List[Double]]]
optionOfList: Any
我做错了什么?
你的意思是像下面这样吗?
val x:List[Option[List[Double]]] = List(Some(List(1.0)),Some(List(2.0)),None)
val y:Option[List[List[Double]]] = {
val k = x.filter(m => m.isDefined).map(m => m.get)
if (k.length>0)
Some(k)
else
None
}
未来[列表[选项[列表[双]]] ->
未来[列表[列表[双]]]
val x: Future[List[Option[List[Double]]]
val y: Future[List[List[Double]]] = x.map(_.flatten)
为什么需要将其包装在一个选项中?
只需映射列表,如果它没有元素,那么它什么都不做。
您可能遗漏了一些导入,或者在仅使用 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
我想将 List[Option[List[Double]]]
转换为 Option[List[List[Double]]]
,如果其中一个选项失败(封装在 Future
中),则生成 None
。通常我应该能够使用 Scalaz 库中的 .sequence
。但是,当我遇到以下问题时:
val matrix = for {
listOfOptions <- futureListOfOptions
optionOfList <- listOfOptions.sequence
} yield optionOfList
matrix: Future[Nothing]
listOfOptions: scala.List[Option[scala.List[Double]]]
optionOfList: Any
我做错了什么?
你的意思是像下面这样吗?
val x:List[Option[List[Double]]] = List(Some(List(1.0)),Some(List(2.0)),None)
val y:Option[List[List[Double]]] = {
val k = x.filter(m => m.isDefined).map(m => m.get)
if (k.length>0)
Some(k)
else
None
}
未来[列表[选项[列表[双]]] ->
未来[列表[列表[双]]]
val x: Future[List[Option[List[Double]]]
val y: Future[List[List[Double]]] = x.map(_.flatten)
为什么需要将其包装在一个选项中?
只需映射列表,如果它没有元素,那么它什么都不做。
您可能遗漏了一些导入,或者在仅使用 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