关于scala:Scalaz中的Future [List [Option [List [Double]]]到Future [Option [List [List [Double]]]]

Future[List[Option[List[Double]]] to Future[Option[List[List[Double]]] in Scalaz

我想将其中一个选项失败(封装在Future中)的List[Option[List[Double]]]转换为产生NoneOption[List[List[Double]]]。通常,我应该能够使用Scalaz lib中的.sequence。但是,当我遇到以下问题时:

1
2
3
4
val matrix = for {
  listOfOptions <- futureListOfOptions
  optionOfList <- listOfOptions.sequence
} yield optionOfList

matrix: Future[Nothing]
listOfOptions: scala.List[Option[scala.List[Double]]]
optionOfList: Any

我在做什么错?


您可能缺少某些导入,或者仅使用sequence时手动推断了类型。如果要编译器为您尝试,请使用sequenceU
这对我有用:

1
2
3
4
5
6
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

完整示例:

1
2
3
4
5
6
7
  val fstart: Future[List[Option[List[Double]]]] = ???
  import scalaz.std.scalaFuture.futureInstance

  val matrix = for {
    lo a?? fstart
    ol = lo.sequenceU
  } yield ol

未来[列表[选项[列表[双人]]]->
未来[列表[列表[双人]]]

1
2
val x: Future[List[Option[List[Double]]]
val y: Future[List[List[Double]]] = x.map(_.flatten)

您为什么需要将其package在选项中?
只需映射列表,如果列表中没有元素,那么它就什么也不做。


您是说像下面吗?

1
2
3
4
5
6
7
8
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
}