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