Scala for循环意外编译错误

时间:2017-03-03 03:03:57

标签: scala

abort

声明a,b,c,d的类型只是为了便于分析代码。

然后我收到意外的编译错误:

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

Error:(10, 15) type mismatch; found : List[Long] required: Option[?] c: Long <- b 的类型是一个列表,我认为b应该表示列表中的每个项目c

为什么编译器期望b应该是Option?

1 个答案:

答案 0 :(得分:0)

问题是您正在将选项与列表混合。如果您将选项转换为List,则可以使用:

flatMap

请记住,理解只是flatMap的语法糖。这实际上是对map1.get(a)

的结果执行了 b: List[Long] <- map1.get(a) c: Long <- b
List

预计会有一个选项。为避免混淆,您应始终使用与开始时相同的类型,在这种情况下为b

另一种选择是完全跳过a: Long <- list c: Long <- map1.get(a).toList.flatten d: Long <- map2.get(c) 并直接展平第一张地图的结果:

find_all_anagrams(f)