在我的Scala2.11.6应用程序中,我定义了如下所示的immutable.ParMap:
object Foos {
val foos: immutable.ParMap[String, Foo] = immutable.ParMap(
...
)
}稍后,我想使用相同的键创建一个新的immutable.ParMap,所以我使用mapValues
val fooServices: immutable.ParMap[String, FooService] = Exchanges.exchanges mapValues (_.fooService)斯卡拉
类型ParMapString、FooService的表达式不符合预期的ParMapString、FooService类型。
作为一种解决办法,我可以使用编译允许的用于理解的方法:
val fooServices: immutable.ParMap[String, FooService] =
for ((name, ex) <- Foos.foos) yield name -> foo.fooService但是,如果能够使用专门为这个任务设计的库函数,那就太好了。为什么mapValues不能在这里推断出最具体的类型?
发布于 2015-04-25 22:01:32
这不是推断最具体类型的问题。它实际上是scala.collection.parallel.ParMapLike$$anon$2的一个实例,它是底层映射的视图(创建的映射将所有操作转发给原始映射)。
它可以单独为不可变分支和可变分支创建,但是为了在库中实现更好的代码共享,它只是在ParMapLike中创建了一次。因此返回类型是正确的,因为不可变.mapValues的类型与可变.mapValues的类型相同。
如果您不想要视图(作为代理实现),而是实际重新生成集合,则使用map。也就是说,xs.mapValues(v => f(v))变成xs.map{ case (k,v) => (k, f(v)) },然后生成一个新的不可变的ParMap,并按这样的方式键入。
https://stackoverflow.com/questions/29871068
复制相似问题