scala – flatMap行为在2.10.0中更改
发布时间:2020-12-16 21:33:10 所属栏目:安全 来源:网络整理
导读:我将一些代码从2.9转换为2.10,并遇到意外的编译错误.这是最小的形式: 在2.9.2中,这工作正常: scala List(1).flatMap(n = Set(1).collect { case w = w })res0: List[Int] = List(1) 在2.10.0中,我们收到一个错误: scala List(1).flatMap(n = Set(1).colle
我将一些代码从2.9转换为2.10,并遇到意外的编译错误.这是最小的形式:
在2.9.2中,这工作正常: scala> List(1).flatMap(n => Set(1).collect { case w => w }) res0: List[Int] = List(1) 在2.10.0中,我们收到一个错误: scala> List(1).flatMap(n => Set(1).collect { case w => w }) <console>:8: error: no type parameters for method flatMap: (f: Int => scala.collection.GenTraversableOnce[B])(implicit bf: scala.collection.generic.CanBuildFrom[List[Int],B,That])That exist so that it can be applied to arguments (Int => scala.collection.immutable.Set[_ <: Int]) --- because --- argument expression's type is not compatible with formal parameter type; found : Int => scala.collection.immutable.Set[_ <: Int] required: Int => scala.collection.GenTraversableOnce[?B] List(1).flatMap(n => Set(1).collect { case w => w }) ^ <console>:8: error: type mismatch; found : Int => scala.collection.immutable.Set[_ <: Int] required: Int => scala.collection.GenTraversableOnce[B] List(1).flatMap(n => Set(1).collect { case w => w }) ^ <console>:8: error: Cannot construct a collection of type That with elements of type B based on a collection of type List[Int]. List(1).flatMap(n => Set(1).collect { case w => w }) ^ 但是,如果我明确地将内部结果转换成List或明确指定flatmap的泛型类型,那么它在2.10.0中可以正常工作: scala> List(1).flatMap(n => Set(1).collect { case w => w }.toList) res1: List[Int] = List(1) scala> List(1).flatMap[Int,List[Int]](n => Set(1).collect { case w => w }) res2: List[Int] = List(1) 有人可以向我解释什么变化是2.10导致类型推断在这里失败,当它不在2.9? 编辑: 深入了解一下,我们可以看到,问题源于收集行为的不同: 在2.9.2中: scala> Set(1).collect { case w => w } res1: scala.collection.immutable.Set[Int] = Set(1) 在2.10.0中: scala> Set(1).collect { case w => w } res4: scala.collection.immutable.Set[_ <: Int] = Set(1) 大概的原因与Set类似,不同于List,它是类型不变的.但是更完整的解释,特别是给出这种变化的动力的解释将是巨大的. 解决方法
这是一个
bug.你也可以通过键入模式,如在
scala> Set(1).collect { case w => w } res0: scala.collection.immutable.Set[_ <: Int] = Set(1) scala> Set(1).collect { case w: Int => w } res1: scala.collection.immutable.Set[Int] = Set(1) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |