Давайте немного распакуем вещи, чтобы увидеть, что происходит более четко.Я переписал PLUS
как более простую функцию, которая по-прежнему принимает четыре параметра, а просто складывает их вместе.
var PLUS = a => b => c => d => a + b + c + d;
var intermediateResult = (PLUS)(1)(2); //the parenthesis around PLUS are actually not needed
console.log("intermediateResult", intermediateResult);
var secondIntermediateResult = intermediateResult(3);
console.log("secondIntermediateResult", secondIntermediateResult);
var finalResult = intermediateResult(3)(4);
console.log("finalResult", finalResult);
Как видите, если вы передадите только первые два параметра, вы получите функцию обратно.Вам нужно «заполнить» все значения, чтобы получить результат.
Теперь давайте разберем, что происходит в вашем коде:
(PLUS) (TWO) (THREE)
Как я уже говорил,Скобки вокруг PLUS
не нужны.Они ничего не делают.Поэтому я перепишу, что здесь происходит:
var firstIntermediateResult = PLUS(TWO);
var secondIntermediateResult = firstIntermediateResult(THREE);
Итак, вы передаете первые два параметра.
numerify((PLUS) (TWO) (THREE))
Если мы подставим разбивку из ранее, это эквивалентно
numerify(secondIntermediateResult)
Итак, давайте посмотрим на функцию numerify
:
var numerify = expr => ((expr)(succRender) (0));
она принимает параметр с именем expr
, затем передает succRender
к этому.Это еще одна функция, но она не имеет значения с точки зрения понимания последовательности вызовов.Сверху видно, что будет возвращаться другая функция, которая принимает один последний параметр перед возвратом результата, и этот параметр равен 0
, поэтому результат вашей программы переписывается так:
var thirdIntermediateResult = secondIntermediateResult(succRender);
var finalResult = thirdIntermediateResult(0);
окончательная форма PLUS
после предоставления всех аргументов выглядит следующим образом
n(f) (m(f)(z)) --> TWO(succRender)(THREE(succRender)(0))