Тип параметра 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
, что вызвало столкновение имен. Ваш анализ кажется правильным.
Чтобы использовать терминологию из лямбда-исчисления, я бы сказал, что программное обеспечение не удалось альфа-конвертировать.