2016-07-31 2 views
1

Моя задача - написать функцию более высокого порядка для объединения списка унарных функций. Первый аргумент - это массив, в котором хранятся имена функций, которые должны быть вызваны. Второй параметр - это значение, которое должно быть используется с функциями. Вот кодUnary function chainer javascript

function square (x) {return x * x;} 
function add3 (x) {return x + 3;} 

    function chainer(a) { 
    return function (b) { 
     for(var i = 0; i < a.length; i++) { 
     return a[i](b) 
     } 
     } 
    } 
    console.log(chainer([square, add3])(4)); 

Нужный выход 19, но он выполняет только первую функцию, и печатает 16. Я думаю, что я должен был бы составить эти функции так или иначе, но немогу обернуть мою голову вокруг него. Должен ли я использовать методы apply() или call() для выполнения задачи? Я новичок в функциональном программировании.

+0

Что такое 'add1'? – Amit

+0

О, это опечатка, торопилась вводить. Уже исправлена. спасибо за указание) – Alex

ответ

2

Ваша проблема заключается в том, что return a[i](b)делает только для вызова первой функции и немедленного возврата ее результата. Вам нужно будет поставить return после цикла:

for (var i = 0; i < a.length; i++) { 
    b = a[i](b) 
} 
return b 

Кроме того, это отличный вариант использования для reduce/fold (который вы, вероятно, сталкивались, прежде чем функции композиции):

return function(b) { 
    return a.reduce(function(b, f) { return f(b) }, b) 
}; 

или даже

return a.reduce(compose, function id(x) { return x; }); 
+0

Большое спасибо. Я думал, что проблема может быть проблемой. И да, я видел эти методы раньше. Большая помощь! Как использовать этот метод в обратном порядке? В цикле for я мог бы использовать «i--», можно ли это сделать с уменьшением? – Alex