2011-12-06 16 views
10

El rasgo Map[A,+B] tiene un métodoTipo parámetro de minBy [B] (f: ((A, B)) ⇒ B) (cmp implícita: Orden [B]): (A, B)

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

lo esperado el B del rasgo a ser el mismo que el del método, pero entonces no puede todavía dar sentido a esto:

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

Aquí, B de Map[A,+B] es String, pero B de minBy es Int - ¿o no?

Así que espera que el tipo del método a ser bastante

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

pero eso no es lo que dice la fuente.

Si ambos son distintos, ¿dónde debería haberlo sabido? Si no lo son, ¿puedes detectar y señalar mi error?

Respuesta

6

Su análisis es correcto, se debe renombrar como C, o algo más. El problema es que Scaladoc simplemente está reemplazando la A en la definición en TraversableLike con una Tupla (A, B) porque es un mapa. Esta es la definición de TraversableLike:

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

porque es un mapa, scaladoc sustituye a la (A) con una tupla (A, B).

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

que como usted observa, no es realmente la firma correcta.

Este es un problema conocido, scaladoc does not disambiguate between same-named type parameters. ¡Vota o envía un parche!

+0

Ah, está bien, estaba equivocado sobre ese comentario de la fuente. El método minBy se declara en GenTraversableOnce, luego se define en TraversableOnce, y ambos no saben acerca de B. Por lo tanto, es realmente un problema escaladoc. Gracias a los dos. – Theodosius

7

Parece que el software que se basa la documentación ha fallado simplemente para cambiar el nombre de la variable B de la definición de la característica de minBy, causando así un nombre choque. Tu análisis parece correcto.

Para usar la terminología del cálculo lambda, diría que el software falló al alpha-convert.

Cuestiones relacionadas