Якщо ви подивитесь, IntFunctionце може стати зрозумілішим: IntFunction<R>це a FunctionalInterface. Він являє собою функцію, яка приймає intі повертає значення типу R.
У цьому випадку тип повернення Rє також а FunctionalInterface, а саме - an IntUnaryOperator. Отже перша (зовнішня) функція сама повертає функцію.
У цьому випадку: При застосуванні до int, curriedAddповинна повертати функцію , яка знову приймає int(і повертається знову int, тому що це те , що IntUnaryOperatorробить).
У функціональному програмуванні прийнято записувати тип функції як, param -> return_valueі саме ви це бачите тут. Отже, тип curriedAddє int -> int -> int(або int -> (int -> int)якщо вам це більше подобається).
Ламбда-синтаксис Java 8 йде разом із цим. Щоб визначити таку функцію, ви пишете
a -> b -> a + b
що дуже схоже на фактичне обчислення лямбда:
λa λb a + b
λb a + b- це функція, яка приймає один параметр bі повертає значення (суму). λa λb a + bце функція, яка приймає один параметр aі повертає іншу функцію одного параметра. λa λb a + bповертається λb a + bіз aзаданим значенням параметра.