Вопрос по функциям и их параметрам
function add(a, b) {
return a + b; } пропускает через функцию square var squareAdd = fmap(square, add); console.log(squareAdd(2, 3)); Добрый день, интересует такой вопрос, как, при вызове функции squareAdd(2, 3) сделать так, что бы 2 и 3 попали в функцию add в качестве аргументов? |
Цитата:
|
function fmap(a, fn) {
return function( arg = fn()){ var resultElem = a(arg); return resultElem; } } function square(x) { return x * x; } Задача состоит в следующем, при вызове squareAdd(2, 3), аргументы 2 и 3 должны попасть в функцию add в качестве аргументов. Функция add возвращает 5, это значение в функции fmap попадает в функцию square в качестве аргумента, и в итоге функция fmap возвращает 25. |
AndreySt,
function add(a, b) { return a + b } function square(a) { return a * a } function fmap(a, b) { return function(c, d) { return a(b(c, d)) } }; var squareAdd = fmap(square, add); alert(squareAdd(2,3)); |
|
Aetae,
а для тех кто ни бум-бум в декораторах, можно код для данного случая? пока вариант для новых браузеров ... может и его можно поправить? function add(a, b) { return a + b } function square(a) { return a * a } function fmap(...a) { return (...b) => a.reduceRight((a, b) => [b.apply(null,a)], b); }; var squareAdd = fmap(square,add); alert(squareAdd(2,3)); |
Всем спасибо)
Работает как надо, теперь буду разбираться почему) Кстати, еще одном условием задачи было что бы в функцию при вызове можно было передать неограниченное количество аргументов. Решением стало: function fmap(a, b) { return function(...c){ return a(b(...c)); } } Спасибо, рони! |
Цитата:
function add(a, b) { return a + b } function square(a) { return a * a } function fmap() { var functions = Array.prototype.slice.call(arguments); return function(){ for(var i = functions.length, result = Array.prototype.slice.call(arguments); i--;) result = functions[i].apply(this, [].concat(result)); return result; } }; var squareAdd = fmap(square,add); alert(squareAdd(2,3));Сам уже сто лет так не писал.) |
Aetae,
:thanks: |
Часовой пояс GMT +3, время: 19:58. |