¿Qué significa un guión después de una llamada al método Scala?

votos
3

La documentación Scala tiene un ejemplo de código que incluye la siguiente línea:

val numberFunc = numbers.foldLeft(List[Int]())_

¿Qué significa el guión después de la llamada al método?

Publicado el 19/09/2018 a las 17:06
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
6

Es una función parcialmente aplicada. Sólo se proporciona el primer parámetro foldLeft(el valor inicial), pero no se proporciona el segundo; posponer para más adelante. En los documentos se enlazó lo hacen en la línea siguiente, donde se definen squares:

val numberFunc = numbers.foldLeft(List[Int]())_
val squares = numberFunc((xs, x) => xs:+ x*x)

Ver que (xs, x) => xs:+ x*x, ese es el segundo parámetro que falta, que se omitiera definiendo al mismo tiempo numberFunc. Si usted hubiera proporcionado de inmediato, entonces numberFuncno sería una función - que sería el valor calculado.

Así que, básicamente, todo el asunto también se puede escribir como una sola línea en forma curry:

val squares = numbers.foldLeft(List[Int]())((xs, x) => xs:+ x*x)

Sin embargo, si usted quiere ser capaz de reutilizar foldLeft una y otra vez, con la misma colección y el valor inicial, sino que proporciona una función diferente cada vez, entonces es muy conveniente para definir una por separado numbersFunc(como lo hicieron en los documentos) y la reutilización con diferentes funciones, por ejemplo:

val squares = numberFunc((xs, x) => xs:+ x*x)
val cubes = numberFunc((xs, x) => xs:+ x*x*x)
...

Tenga en cuenta que el mensaje de error del compilador es bastante sencillo en caso de que olvide el subrayado:

Error: falta la lista de argumentos para el método de foldLeft rasgo LinearSeqOptimized métodos no aplicados solamente se convierten en funciones cuando se espera un tipo de función. Puede hacer esta conversión explícita por escrito foldLeft _o foldLeft(_)(_)en lugar de foldLeft. val numberFunc = numbers.foldLeft (ListInt)

EDIT: Jaja me he dado cuenta de que lo hicieron exactamente lo mismo con cubesla documentación.

Respondida el 19/09/2018 a las 17:18
fuente por usuario

votos
1

No sé si ayuda pero prefiero esta sintaxis

val numberFunc = numbers.foldLeft(List[Int]())(_)

entonces numberFunces básicamente un delegado correspondiente a un método de instancia (ejemplo ser numbers) en espera de un parámetro. Que más tarde llega a ser una expresión lambda en el ejemplo de la documentación Scala

Respondida el 19/09/2018 a las 17:24
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more