Введите параметр minBy [B] (f: ((A, B)) ⇒ B) (неявный cmp: порядок [B]): (A, B) - PullRequest
10 голосов
/ 06 декабря 2011

Черта Map[A,+B] имеет метод

def minBy [B] (f: ((A, B)) ⇒ B)(implicit cmp: Ordering[B]): (A, B)

Я ожидал, что B черты будет таким же, как в методе, но тогда я все еще не могу понятьэто:

val m2 = Map('a -> "1", 'b ->"2" ,'c ->"3")
m2.minBy((t:(Symbol,String))=>Integer.parseInt(t._2))

Здесь B из Map[A,+B] равно String, но B из minBy равно Int - или я ошибаюсь?

Итак, яожидал, что тип метода будет скорее

def minBy [C] (f: ((A, B)) ⇒ C)(implicit cmp: Ordering[C]): (A, B)

Но это не то, что говорит источник.

Если оба они различны, откуда мне знать?Если нет, можете ли вы заметить и указать на мою ошибку?

Ответы [ 2 ]

7 голосов
/ 06 декабря 2011

Похоже, что программное обеспечение, которое создает документацию, просто не смогло переименовать переменную B из определения черты minBy, что привело к конфликту имен. Ваш анализ кажется правильным.

Чтобы использовать терминологию из лямбда-исчисления, я бы сказал, что программному обеспечению не удалось альфа-преобразование .

6 голосов
/ 06 декабря 2011

Ваш анализ верен, он должен быть переименован в C или как-то еще.Проблема в том, что scaladoc просто заменяет A в определении в TraversableLike на Tuple (A, B), потому что это карта.Это определение из TraversableLike:

def minBy [B] (f: (A) ⇒ B)(implicit cmp: Ordering[B]): A

, поскольку это карта, скаладок заменяет (A) на кортеж (A, B).

def minBy [B] (f: (A, B) ⇒ B)(implicit cmp: Ordering[B]): (A, B)

, который, как вы заметили,на самом деле неверная подпись.

Это известная проблема, scaladoc не устраняет неоднозначность между параметрами типа с одноименным именем .Проголосуйте или отправьте патч!

...