Scala for推导式中生成器的类型限制问题咨询
Scala For推导式的生成器类型限制
Scala的for推导式本质是flatMap、map和withFilter的语法糖,推导式的最终返回类型由第一个生成器的类型决定,这就是你遇到类型限制的核心原因:
情况1:第一个生成器为非Option集合
当第一个生成器是List这类集合时,后续生成器可以是任意同类型或兼容的集合类型。因为List的flatMap方法接受的函数返回值是IterableOnce,嵌套集合会被正确展开,最终返回List类型的结果:
case class D(p1: Option[Int], p2: List[Int]) val d = for p1 <- List(1) p2 <- List(2) yield D(Option(p1), List(p2)) assertEquals(d, List(D(Some(1), List(2))))
情况2:第一个生成器为Option
当第一个生成器是Option时,推导式的后续操作会依赖Option的flatMap方法,而Option的flatMap要求传入的函数必须返回Option类型(而非其他集合)。如果第二个生成器用List,函数返回的是List,和Option的flatMap返回类型要求冲突,因此编译失败:
val e = for p1 <- Option(1) // p2 <- List(2) // 编译错误:Found: List[D], required: Option[Nothing] yield D(Option(p1), List(2)) assertEquals(e, Some(D(Some(1), List(2))))
注意:IntelliJ IDEA 2022.2.1的编译器提示存在误差,实际第二个生成器的类型是List[Int],而非提示的List[D](测试版本:Scala 3.1.1)。
内容的提问来源于stack exchange,提问作者Carlos De Human
相关产品推荐
相关产品推荐

