Тип параметра minBy [B] (f: ((A, B)) ⇒ B) (неявный cmp: Заказ [B]): (A, B)

Знак 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 of Map[A,+B] - String, но B of minBy - Int - или err I?

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

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

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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