Если посмотреть, IntFunction
может стать яснее: IntFunction<R>
это файл FunctionalInterface
. Он представляет функцию, которая принимает int
и возвращает значение типа R
.
В этом случае возвращаемый тип R
также является a FunctionalInterface
, а именно 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
установленным значением параметра.