Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вопрос по функциям и их параметрам (https://javascript.ru/forum/misc/65043-vopros-po-funkciyam-i-ikh-parametram.html)

AndreySt 21.09.2016 19:03

Вопрос по функциям и их параметрам
 
function add(a, b) {
return a + b;
}
пропускает через функцию square
var squareAdd = fmap(square, add);
console.log(squareAdd(2, 3));


Добрый день, интересует такой вопрос, как, при вызове функции squareAdd(2, 3) сделать так, что бы 2 и 3 попали в функцию add в качестве аргументов?

warren buffet 21.09.2016 22:34

Цитата:

Сообщение от AndreySt
попали в функцию add

Там где она вызывается там и сделай.

AndreySt 21.09.2016 22:51

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.

рони 21.09.2016 23:34

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 22.09.2016 00:26

https://learn.javascript.ru/decorators

рони 22.09.2016 00:52

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));

AndreySt 22.09.2016 11:35

Всем спасибо)
Работает как надо, теперь буду разбираться почему)

Кстати, еще одном условием задачи было что бы в функцию при вызове можно было передать неограниченное количество аргументов. Решением стало:
function fmap(a, b) {
return function(...c){
return a(b(...c));
}
}
Спасибо, рони!

Aetae 23.09.2016 06:21

Цитата:

Сообщение от рони (Сообщение 429409)
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));
Сам уже сто лет так не писал.)

рони 23.09.2016 10:31

Aetae,
:thanks:


Часовой пояс GMT +3, время: 19:58.