【问题标题】:Future[List[Option[List[Double]]] to Future[Option[List[List[Double]]] in ScalazScalaz 中的 Future[List[Option[List[Double]]] 到 Future[Option[List[List[Double]]]
【发布时间】:2016-08-26 15:05:35
【问题描述】:

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

val matrix = for {
  listOfOptions <- futureListOfOptions
  optionOfList <- listOfOptions.sequence
} yield optionOfList

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

我做错了什么?

【问题讨论】:

  • “我做错了什么?” -- 我认为最错误的事情是拥有像Future[List[Option[List[Double]]] 这样的类型,你最好将它们展平。
  • 在我的情况下,如果一个选项失败,我希望它产生None,如果我将它展平,我没有那个。我有这个“混乱”,因为它来自 Map 类型为 Future[Option[List[Double]]] 的值(向服务器查询向量,因此是未来)。
  • 应该不错,可能是你的IDE丢了?尝试在我想说的 val 声明中输入矩阵。
  • ?这没有任何意义..“如果一个选项失败”?
  • 你的一切类型是什么以及你想要的matrix的类型

标签: scala scalaz


【解决方案1】:

仅使用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】:

    Future[List[Option[List[Double]]] ->
    未来[列表[列表[双]]]

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

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

    【讨论】:

      【解决方案3】:

      你的意思是像下面这样吗?

      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 k = x.filter(m =&gt; m.isDefined).map(m =&gt; m.get) 不好
      猜你喜欢
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 2015-09-21
      • 2022-01-03
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多