21.09.2016, 19:03
|
Новичок на форуме
|
|
Регистрация: 16.05.2016
Сообщений: 7
|
|
Вопрос по функциям и их параметрам
function add(a, b) {
return a + b;
}
пропускает через функцию square
var squareAdd = fmap(square, add);
console.log(squareAdd(2, 3));
Добрый день, интересует такой вопрос, как, при вызове функции squareAdd(2, 3) сделать так, что бы 2 и 3 попали в функцию add в качестве аргументов?
|
|
21.09.2016, 22:34
|
Профессор
|
|
Регистрация: 08.07.2016
Сообщений: 1,332
|
|
Сообщение от AndreySt
|
попали в функцию add
|
Там где она вызывается там и сделай.
|
|
21.09.2016, 22:51
|
Новичок на форуме
|
|
Регистрация: 16.05.2016
Сообщений: 7
|
|
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, 21.09.2016 в 23:05.
|
|
21.09.2016, 23:34
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,124
|
|
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));
|
|
22.09.2016, 00:26
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
__________________
29375, 35
|
|
22.09.2016, 00:52
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,124
|
|
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));
|
|
22.09.2016, 11:35
|
Новичок на форуме
|
|
Регистрация: 16.05.2016
Сообщений: 7
|
|
Всем спасибо)
Работает как надо, теперь буду разбираться почему)
Кстати, еще одном условием задачи было что бы в функцию при вызове можно было передать неограниченное количество аргументов. Решением стало:
function fmap(a, b) {
return function(...c){
return a(b(...c));
}
}
Спасибо, рони!
Последний раз редактировалось AndreySt, 22.09.2016 в 11:47.
|
|
23.09.2016, 06:21
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
Сообщение от рони
|
Aetae,
а для тех кто ни бум-бум в декораторах, можно код для данного случая?
пока вариант для новых браузеров ... может и его можно поправить?
|
В смысле по-старинке? Как-то так наверное:
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));
Сам уже сто лет так не писал.)
__________________
29375, 35
|
|
23.09.2016, 10:31
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,124
|
|
Aetae,
|
|
|
|