斯卡拉多克在地图上的地图

时间:2010-09-28 09:49:32

标签: scala scala-collections

根据Map对象上map方法的scaladoc,它应该返回一个新的Map:

 def   map  [B]  (f: ((A, B)) ⇒ B)  : Map[B]   

“返回一个新的地图,该地图是将给定的函数f应用于此地图的每个元素并收集结果。”

但事实并非如此:

scala> val countries = Map("NO" -> "Norway", "US" -> "United States", "DE" -> "Germany")
countries: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map((NO,Norway), (US,United States), (DE,Germany))

countries map { _._1 }
res4: scala.collection.immutable.Iterable[java.lang.String] = List(NO, US, DE)

但是,这种行为是我所期望的。那么文档是错误的,还是我错过了什么?

2 个答案:

答案 0 :(得分:5)

您正在阅读错误的地图功能。

def map [B](f :((A,B))⇒B):地图[B]

但你正在使用:

def map [B,That](f:((A,B))⇒B)(隐含的bf:CanBuildFrom [Map [A​​,B],B,That]):那个

因为你要返回一个字符串,所以你不是使用拳头而是第二个。为此,ScalaDoc说:

“一个新的类型集合,它是通过将给定的函数f应用于此映射的每个元素并收集结果而产生的。”

答案 1 :(得分:5)

Scaladoc的@usecase加法是相当匆忙构思和实施的,并且有一些皱纹。在这种情况下,用例在Scaladoc中为TraversableLike#map

定义
@usecase def map[B](f: A => B): $Coll[B]

$Coll将使用scala.collection.Map中定义的值替换为简单文本替换。

/**
 *  @define Coll Map
 *  @define coll map
 */
object Map extends MapFactory[Map]

可以做些什么呢?也许文本替换的结果可以进行类型检查,这将排除这些边缘情况。