Если посмотреть, 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установленным значением параметра.