2017-03-03 8 views
2
object Main { 
    val list = List[Long]() 
    val map1 = Map[Long, List[Long]]() 
    val map2 = Map[Long, Long]() 

    def main(args: Array[String]): Unit = { 
    for { 
     a: Long <- list 
     b: List[Long] <- map1.get(a) 
     c: Long <- b 
     d: Long <- map2.get(c) 
    } yield d 
    } 
} 

a、b、c、dの型は、コードを解析しやすいように宣言されています。私は予期しないコンパイル・エラーが発生しますループの予期しないコンパイルエラーのスララ

は次に:

Error:(10, 15) type mismatch; 
found : List[Long] 
required: Option[?] 
     c: Long <- b 

bのタイプがリストである、私は、コンパイラがbがあるべき期待するのはなぜcが一覧でb

を各項目を意味すべきだと思いますオプションの何か?

答えて

0

問題は、オプションをリストと混合することです。あなたがリストにあなたのオプションを変換する場合、それは動作します:

b: List[Long] <- map1.get(a).toList 

は理解のために flatMapのためだけ糖衣構文であることを忘れないでください。これは実際に map1.get(a)の結果に flatMapを実行している:

結果としてオプションを期待
b: List[Long] <- map1.get(a) 
    c: Long <- b 

。混乱を避けるために、いつも同じタイプのものを使用してください。この場合はListです。

a: Long <- list 
c: Long <- map1.get(a).toList.flatten 
d: Long <- map2.get(c) 

別のオプションは完全にbをスキップして、直接、最初のマップの結果を平らにするだろう

関連する問題