2015-11-24 1 views
5

В настоящее время я работаю над проблемой программирования в свое личное время, когда спрашивает, что я создаю функцию javascript, которая может вызывается таким образом.Написание курсовой функции javascript, которую можно назвать произвольным числом раз, которое возвращает значение при самом последнем вызове функции

add(1) // 1 
add(1)(2) // 3 
add(1)(2)(3); // 6 
add(1)(2)(3)(4); // 10 
add(1)(2)(3)(4)(5); // 15 

У меня возникли проблемы с выяснением того, как заставить его вернуть значение при последнем вызове.

Например, для того, чтобы add(1)(2) работать, то add(1) должен возвращать функцию, но в соответствии с инструкциями add(1) при вызове сама по себе будет возвращать 1.

Я предполагаю, что вы можете преодолеть это, чтобы выяснить, сколько раз подряд вызывается функция add, но я не могу придумать способ ее достижения. Есть ли у кого-нибудь намеки, которые могут указывать мне в правильном направлении?

Я прочитал эти две статьи (1, 2) по функции currying, и я их понимаю, но я не уверен, как делать currying при работе с переменным числом аргументов.

+2

Так что вы пробовали? Множество примеров карри в сети. вы возвращаете функцию ... – epascarello

+1

@epascarello жаль, если я не уточнил. Я прочитал этот http://www.crockford.com/javascript/www_svendtofte_com/code/curried_javascript/index.html и этот http://blog.carbonfive.com/2015/01/14/gettin-freaky-functional -wcurried-JavaScript /. Что касается моих попыток, они были такими, что я не вижу значения при их публикации. Также у меня нет проблем с каррированием. У меня проблема с функцией, принимающей переменное количество вызовов, прежде чем она окончательно разрешится. Я не знаю, как это сделать. – m0meni

+0

Btw, вместо использования вариационных функций, вы должны решать соответствующие проблемы либо с помощью функций сокращения и двоичного оператора, либо с помощью «полувариантной» функции, где переменные аргументы передаются как массив. Это лучше подходит для функционального стиля. Функции Variadic создают больше проблем, чем они решают, и их следует избегать. – rand

ответ

2

Нельзя использовать значениеOf().

function add(initNum) { 
 
    var sum = initNum; 
 
    var callback = function (num) { 
 
     sum += num; 
 
     return callback; 
 
    }; 
 
    callback.valueOf = function() { 
 
     return sum; 
 
    }; 
 
    return callback; 
 
}; 
 
console.log(add(1)(2)==3);   //true 
 
console.log(add(1)(1)+1);    //3 
 
console.log(add(1)(2)(3).valueOf()); //6

+0

А так это один случай, когда '==' дает вам ответ, который вы хотите, а '===' - нет. – m0meni

+1

Да, это все еще невозможно * без * добавления специального внешнего вызова для прекращения отправки аргументов. Или, если говорить более четко, API в исходном вопросе невозможно. – naomik

+1

@naomik Это намного лучше, чем просто прекратить метод или указать, сколько итераций требуется для каррирования. С valueOf все, что вызывает его внутренне, получит значение без вас, разработчик должен вручную остановить цепочку. – epascarello

4

Невозможно выполнить вариационную функцию с неизвестным количеством аргументов.

Где add это VARIADIC функция, вы могли бы сделать что-то вроде

var add5 = curryN(add, 5); 
add5(1)(2)(3)(4)(5); //=> 15 

var add3 = curryN(add, 3); 
add3(1)(2)(3); //=> 6 

Там просто не избежать этого Тхо, так как кэрри функция будет продолжать возвращать функцию, пока последний аргумент не принимается, в какой момент вычисление выполняется.


Единственный другой вариант заключается в создании какой-то способ «короткого замыкания» Аргументы и уведомляет функцию, что аргументы делается отправкой. Для этого потребуется что-то вроде

var xadd = curryUntilUndefined(add); 
xadd(1)(2)(3)(4)(5)(undefined); //=> 15 

Здесь undefined сигналов конца переменных числа аргументов. Я действительно не рекомендую это из-за других проблем, которые он может создать для вас. Не говоря уже о том, что это не особенно приятно смотреть.

+0

Я думал об одном и том же, но я хотел остаться надеющимся, что это было из-за моей собственной нехватки знаний. Я собираюсь подождать и посмотреть, есть ли у кого-то чудесное решение, но в противном случае я просто приму твое. – m0meni

+1

@ AR7 Я сделал [еще один ответ о валютных функциях] (http://stackoverflow.com/a/30249365/633183), если вы заинтересованы. – naomik

+0

Похоже, вы не учитывали странность javascript в своем ответе. Эпаскарелло понял. – m0meni