2011-12-06 23 views
10

Il tratto Map[A,+B] ha un metodoTipo di minBy [B] (f: ((A, B)) ⇒ B) (CMP implicita: Ordinamento [B]): (A, B)

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

mi aspettavo il B del carattere per essere la stessa di quella nel metodo, ma poi non può ancora dare un senso a questo:

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

Qui, B di Map[A,+B] è String, ma B di minBy è Int - o err I?

così mi aspettavo il tipo di metodo per essere piuttosto

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

ma questo non è quello che dice la fonte.

Se entrambi sono distinti, dove dovrei saperlo? Se non lo sono - riesci a individuare, e sottolineare, il mio errore?

risposta

6

L'analisi è corretta, deve essere rinominata come C o qualcos'altro. Il problema è che scaladoc sta semplicemente sostituendo l'A nella definizione in TraversableLike con una Tupla (A, B) perché è una mappa. Questa è la definizione da TraversableLike:

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

perché è una mappa, scaladoc sostituisce il (A) con una tupla (A, B).

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

che, come si osserva, non è in realtà la firma corretta.

Questo è un problema noto, scaladoc does not disambiguate between same-named type parameters. Vota o invia una patch!

+0

Ah, ok, ho sbagliato su quell'osservazione della fonte. Il metodo minBy è dichiarato in GenTraversableOnce, quindi definito in TraversableOnce - ed entrambi non conoscono B. Quindi è davvero un problema di scaladoc. Grazie ad entrambi. – Theodosius

7

Sembra che il software che crea la documentazione abbia semplicemente omesso di rinominare la variabile B dalla definizione di tratto di minBy, causando così un conflitto di nomi. La tua analisi sembra corretta.

Per utilizzare la terminologia da lambda calcolo, direi che il software non è riuscito a alpha-convert.

Problemi correlati