скаладок для карты на карте - PullRequest
1 голос
/ 28 сентября 2010

Согласно скалярному методу для метода карты объекта 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 ]

5 голосов
/ 28 сентября 2010

@usecase дополнение к Scaladoc было довольно поспешно задумано и реализовано и имеет несколько морщин.В этом случае сценарий использования определяется в 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]

Что можно с этим сделать?Возможно, результатом подстановки текста будет проверка типа, что исключит эти крайние случаи.

5 голосов
/ 28 сентября 2010

Вы читаете неправильную функцию карты.

def map [B] (f: ((A, B)) ⇒ B): карта [B]

Но вы используете:

def map [B, То] (f: ((A, B)) ⇒ B) (неявное bf: CanBuildFrom [Map [A, B], B, That]): Это

Поскольку вы возвращаете строку, выне кулаком, а вторым.И для этого ScalaDoc говорит:

"новая коллекция типа That, возникающая в результате применения данной функции f к каждому элементу этой карты и сбора результатов."

...