未来[List [Option [List [Double]]]到Scalaz的未来[Option [List [List [Double]]]

时间:2016-08-25 11:54:52

标签: scala scalaz

如果其中一个选项失败(封装在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

我做错了什么?

3 个答案:

答案 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