2016-08-25 31 views
2

我想將List[Option[List[Double]]]轉換爲Option[List[List[Double]]],如果其中一個選項失敗在Future中)。通常我應該可以使用Scalaz庫中的.sequence。然而,當我有以下問題:斯卡拉茲未來[列表[選項[List [Double]]]到未來[Option [List [List [Double]]]]

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

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

我在做什麼錯?

+2

「什麼?我做錯了」 - 我認爲大部分錯誤的事情都是像Future [List [Option [List [Double]]]這樣的類型,你最好把它們弄平。 – dveim

+0

在我的情況下,如果一個選項失敗,我希望它產生'None',如果我把它弄平,我沒有那個。我有這個「混亂」,因爲它來自'Future [Option [List [Double]]]'(查詢到服務器的向量,因此是未來)類型的'Map'的值。 – DennisVDB

+0

它應該是好的,也許它是你的IDE丟失了?嘗試在val聲明中輸入矩陣,我會說。 – C4stor

回答

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 
-1

你的意思是像下面那樣嗎?

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 
} 
+0

'val k = x.filter(m => m.isDefined).map(m => m.get)'很壞 –

+0

嗨,爲什麼它是壞?沒有工作或其他? –

1

未來[列表[選項[列表[雙]]] - >
未來[一覽[名單[雙]]]

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

爲什麼你需要在一個選項來包裝這個?
只是映射列表,如果它沒有元素,那麼它什麼都不做。