scala Список карт против mapConserve - PullRequest
8 голосов
/ 23 декабря 2011

Я пытаюсь понять mapConserve, который называется «Как карта xs f, но возвращает xs без изменений, если функция f отображает все элементы на себя», из Список .Тем не менее, он выдает ошибку.

def map [B] (f: (A) ⇒ B): List[B]
def mapConserve (f: (A) ⇒ A): List[A]
def mapConserve [B >: A <: AnyRef] (f: (A) ⇒ B): List[B]


scala> list map (x=>x)
res105: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> list mapConserve (x=>x)
<console>:12: error: inferred type arguments [Int] do not conform to method mapConserve's type parameter bounds [B >: Int <: AnyRef]
              list mapConserve (x=>x)
                   ^

Код mapConserve должен удовлетворять функции (A) => A.Если нет, он все равно должен удовлетворять функции (A) => B, поскольку тип A может быть подтипом и супертипом самого себя.Пожалуйста, сообщите мне цель mapConserve и ошибку.

1 Ответ

19 голосов
/ 23 декабря 2011

На самом деле, mapConserve определяется как

def mapConserve[A <: AnyRef](xs: List[A])(f: A => A): List[A]
def mapConserve[B >: A <: AnyRef](f: A => B): List[B]

поэтому A должен быть подтипом AnyRef. Int является подтипом AnyVal, что приводит к ошибке.

scala> val l = List("foo", "bar", "baz")
l: List[java.lang.String] = List(foo, bar, baz)

scala> l.mapConserve(_.toUpperCase)
res4: List[java.lang.String] = List(FOO, BAR, BAZ)

scala> l.mapConserve(identity)
res5: List[java.lang.String] = List(foo, bar, baz)

Обновление:

Единственная разница между map и mapConserve, как это описано в scaladoc :

Создает новый список, применяя функцию ко всем элементам этого списка. Как и xs map f, но возвращает xs без изменений, если функция f отображает все элементы на себя (как определено в eq).

scala> val xs = List.fill(1000000)("foo")
xs: List[java.lang.String] = List(foo, foo,...)

scala> xs.map(identity) eq xs
res48: Boolean = false

scala> xs.mapConserve(identity) eq xs
res49: Boolean = true

И xs mapConserve identity примерно в пять раз быстрее в моем простом тесте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...