Si lo miras IntFunction
, podría ser más claro: IntFunction<R>
es un FunctionalInterface
. Representa una función que toma int
y devuelve un valor de tipo R
.
En este caso, el tipo de retorno R
también es a FunctionalInterface
, es decir, an IntUnaryOperator
. Entonces, la primera función (externa) en sí misma devuelve una función.
En este caso: cuando se aplica a an int
, curriedAdd
se supone que devuelve una función que vuelve a tomar an int
(y vuelve de nuevo int
, porque eso es lo que IntUnaryOperator
hace).
En la programación funcional, es común escribir el tipo de función como param -> return_value
y ve exactamente eso aquí. Entonces el tipo de curriedAdd
es int -> int -> int
(o int -> (int -> int)
si te gusta más).
La sintaxis lambda de Java 8 va de la mano con esto. Para definir tal función, escribe
a -> b -> a + b
que es muy similar al cálculo lambda real:
λa λb a + b
λb a + b
es una función que toma un solo parámetro b
y devuelve un valor (la suma). λa λb a + b
es una función que acepta un solo parámetro a
y devuelve otra función de un solo parámetro. λa λb a + b
vuelve λb a + b
con a
establecido en el valor del parámetro.