Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.09.2016, 19:03
Новичок на форуме
Отправить личное сообщение для AndreySt Посмотреть профиль Найти все сообщения от AndreySt
 
Регистрация: 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 в качестве аргументов?
Ответить с цитированием
  #2 (permalink)  
Старый 21.09.2016, 19:49
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,663

AndreySt, fmap покажи
Ответить с цитированием
  #3 (permalink)  
Старый 21.09.2016, 22:34
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Сообщение от AndreySt
попали в функцию add
Там где она вызывается там и сделай.
Ответить с цитированием
  #4 (permalink)  
Старый 21.09.2016, 22:51
Новичок на форуме
Отправить личное сообщение для AndreySt Посмотреть профиль Найти все сообщения от AndreySt
 
Регистрация: 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.
Ответить с цитированием
  #5 (permalink)  
Старый 21.09.2016, 23:34
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

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));
Ответить с цитированием
  #6 (permalink)  
Старый 22.09.2016, 00:26
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,514

https://learn.javascript.ru/decorators
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 22.09.2016, 00:52
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

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));
Ответить с цитированием
  #8 (permalink)  
Старый 22.09.2016, 11:35
Новичок на форуме
Отправить личное сообщение для AndreySt Посмотреть профиль Найти все сообщения от AndreySt
 
Регистрация: 16.05.2016
Сообщений: 7

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

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

Последний раз редактировалось AndreySt, 22.09.2016 в 11:47.
Ответить с цитированием
  #9 (permalink)  
Старый 23.09.2016, 06:21
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,514

Сообщение от рони Посмотреть сообщение
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
Ответить с цитированием
  #10 (permalink)  
Старый 23.09.2016, 10:31
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

Aetae,
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нубский вопрос по функциям Saret Библиотеки/Тулкиты/Фреймворки 1 22.07.2016 14:59
Вопрос по функциям tiundv Events/DOM/Window 12 26.04.2015 07:27
Вопрос по функциям eirnvn Общие вопросы Javascript 7 15.04.2013 12:39
Всплытие событий или что то не так... Кирюха =) jQuery 6 30.03.2013 12:56
Вопрос по удалению элемента в массиве и по функциям bot87 Общие вопросы Javascript 5 26.04.2012 14:43