Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为什么immutable.ParMap.mapValues返回ParMap而不是immutable.ParMap?_Scala - Fatal编程技术网

Scala 为什么immutable.ParMap.mapValues返回ParMap而不是immutable.ParMap?

Scala 为什么immutable.ParMap.mapValues返回ParMap而不是immutable.ParMap?,scala,Scala,在Scala 2.11.6应用程序中,我定义了一个不可变的.ParMap,如下所示: object Foos { val foos: immutable.ParMap[String, Foo] = immutable.ParMap( ... ) } 稍后,我想使用相同的键创建一个新的不可变.ParMap,因此我使用mapValues: val fooServices: immutable.ParMap[String, FooService] = Exchan

在Scala 2.11.6应用程序中,我定义了一个
不可变的.ParMap
,如下所示:

  object Foos {
    val foos: immutable.ParMap[String, Foo] = immutable.ParMap(
     ...
    )
  }
稍后,我想使用相同的键创建一个新的
不可变.ParMap
,因此我使用
mapValues

 val fooServices: immutable.ParMap[String, FooService] = Exchanges.exchanges mapValues (_.fooService)
斯卡拉抱怨道

ParMap[String,FooService]类型的表达式不符合 应为类型ParMap[String,FooService]

作为一种解决方法,我可以使用编译器允许的用于理解的:

val fooServices: immutable.ParMap[String, FooService] =
    for ((name, ex) <- Foos.foos) yield name -> foo.fooService
val fooServices:immutable.ParMap[String,FooService]=
对于((名称,例如)foo.fooService

但是,如果能够使用专门为此任务设计的库函数,那就太好了。为什么
mapValues
不能在这里推断出最具体的类型?

这不是推断最具体的类型的问题。它实际上是
scala.collection.parallel.ParMapLike$$anon$2
的一个实例,这是一个视图ng映射(创建的映射将所有操作转发给原始映射)

它可以分别为不可变和可变分支创建,但为了在库中更好地共享代码,它只在
ParMapLike
中创建了一次。因此返回类型是正确的,因为不可变
.mapValues
的类型与可变
.mapValues
的类型相同


如果您不希望视图(实现为代理)而是实际重新生成集合,请改用
map
。即
xs.mapValues(v=>f(v))
变成
xs.map{case(k,v)=>(k,f(v))}
然后将生成一个新的不可变的
ParMap

Ahh,这现在非常合理。我没有意识到
mapValues
实际上返回了一个视图。这有点混乱,因为与其他集合(例如
Seq
)您需要显式调用
.view
。@user1885198-
mapValues
总是返回一个视图,并行或不并行。它这样做有点令人惊讶,但它是一致的。也许它应该被称为
valueView
。在
Seq
中没有“每个条目的映射部分”方法,因此它不是真正的可比性。