2011-12-06 25 views
10

Cecha Map[A,+B] ma metodęRodzaj minBy [B] (f: ((A, B)) ⇒ B) (ukryte CMP: Kolejność [B]): (A, B)

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

spodziewałem się B z cechą być takie same jak w metodzie, ale nie mogę jeszcze zrozumieć to:

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

Tutaj B od Map[A,+B] jest String, ale B z minBy to jest Int - lub err I?

więc spodziewałem rodzaj metody jest raczej

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

Ale to nie to, co mówi źródło.

Jeśli oba są odrębne, gdzie powinienem wiedzieć? Jeśli tak nie jest - czy możesz zauważyć i wskazać mój błąd?

Odpowiedz

6

Analiza jest prawidłowa, powinna zostać zmieniona na C lub coś innego. Problem polega na tym, że scaladoc po prostu zastępuje A w definicji w TraversableLike krotką (A, B), ponieważ jest to mapa. Jest to definicja z TraversableLike:

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

bo to mapa, scaladoc zastępuje (a) z krotki (A, B).

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

co, jak zaobserwujesz, nie jest właściwie poprawnym podpisem. Jest to znany numer, . Oddaj głos lub prześlij łatkę!

+0

Ah, okej, myliłem się co do tej uwagi źródłowej. Metoda minBy jest zadeklarowana w GenTraversableOnce, a następnie zdefiniowana w TraversableOnce - i obie nie wiedzą o B. Tak naprawdę jest to problem skaladoc. Dziękuję wam obu. – Theodosius

7

Wygląda na to, że oprogramowanie, które buduje dokumentację, po prostu nie zmieniło nazwy zmiennej B z definicji cechy minBy, powodując konflikt nazwy. Twoja analiza wydaje się być poprawna.

Aby użyć terminologii z rachunku lambda, powiedziałbym, że oprogramowanie nie powiodło się alpha-convert.

Powiązane problemy