2016-08-25 6 views
2

Option[List[List[Double]]]に変換し、オプションの1つが失敗した場合はNoneになりますFuture)。通常、私はScalazのlibから.sequenceを使用できるはずです。しかし、私は次のような問題がある場合:将来Scalazの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

私のケースでは、1つのオプションが失敗した場合、それは '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) 


リストをマップするだけです。要素がない場合は、何もしません。