Bueno ... f()
toma una cadena como parámetro. La construcción _.toString
tiene el tipo A <: Any => String
. La función f()
espera un tipo de String
, por lo que el ejemplo anterior no escribe check. Parece que Scala es amigable en este caso y le da al usuario otra oportunidad. El mensaje de error significa: "Según mi algoritmo de inferencia de tipo, esto no se compila. Ponga los tipos y podría, si es algo que no puedo inferir".
Debería escribir la función anónima a mano en este caso, es decir, a.map(n => f(n.toString))
. Esto no es una limitación de la inferencia de tipo, sino del símbolo de comodín. Básicamente, cuando escribe a.map(f(_.toString))
, el _.toString
se expande a una función anónima dentro de los corchetes más cercanos que puede encontrar, de lo contrario, esto generaría una enorme ambigüedad. Imagine algo como f(g(_.toString))
. ¿Esto significa f(g(x => x.toString))
o f(x => g(x.toString))
? Peores ambigüedades surgirían para múltiples llamadas a funciones anidadas. Por lo tanto, el verificador de tipo Scala toma la solución más lógica, como se describió anteriormente.
Nitpick: la primera línea de su código debe ser val a = List(1,2,3,4)
:).