Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.06.2019, 15:42
Аспирант
Отправить личное сообщение для DarkPhoenix Посмотреть профиль Найти все сообщения от DarkPhoenix
 
Регистрация: 11.05.2019
Сообщений: 30

curryN, которая каррирует N-е количество аргументов
Саму функцию я написал. Но опять нужны параметры неопределенного кол-ва.....
function print(first, middle, last) {
  return alert(`${first} ${middle} ${last}`);
}
 
const curried = curryN(2, print);
 
 
function curryN(count, func) {
 
  const params = [];
 
  function f(param) {
    params.push(param);
    if (params.length === count) {
      func(...params);
    }
    return f;
  }
  return f
}
 
curried("123")("456")

У меня к примеру 2 параметра, но если я допишу 3, то будет undefined.
Или же надо передавать в функцию 3. А нужно универсальную. Которая принимает любое кол-во.
Я так понимаю тут опять замешаны ...args или еще что.
Прошу статью или код.
Благодарю!
Ответить с цитированием
  #2 (permalink)  
Старый 16.06.2019, 15:51
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

подожду переводчика или код.
Ответить с цитированием
  #3 (permalink)  
Старый 16.06.2019, 15:57
Аспирант
Отправить личное сообщение для DarkPhoenix Посмотреть профиль Найти все сообщения от DarkPhoenix
 
Регистрация: 11.05.2019
Сообщений: 30

Написать функцию curryN, которая каррирует N-е количество аргументов переданной функции
function printFullName(firstName, lastName, middleName) {
  console.log(`${firstName}${lastName}${middleName}`)
}
const curriedPrintFullName = curryN(3, printFullName);
curriedPrintFullName('Semen')('Semenovich')('Kostev')


Само задание.
А нужно сделать функцию которая каррирует N-е количество аргументов переданной функции
Ответить с цитированием
  #4 (permalink)  
Старый 16.06.2019, 16:30
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

DarkPhoenix,
function printFullName(firstName, lastName, middleName) {
  console.log(`${firstName}${lastName}${middleName}`)
}
const curryN = (num, fn) => {
    const arg = [];
    const f = a => arg.push(a) == num ? fn(...arg) : f
    return f
}
const curriedPrintFullName = curryN(3, printFullName);
curriedPrintFullName('Semen')('Semenovich')('Kostev')
Ответить с цитированием
  #5 (permalink)  
Старый 16.06.2019, 21:45
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Каррирование: из фукнкции типа (A, B) => C сделать возможным A => (B => C)
рони, важно понимать разницу между каррированием и применением функции... У вас одно применение каррирует, а другое применяет... Следует выделить каррирование в отдельный метод!

function curry(f, ...args) {
	return f.bind(this, ...args)
}

function printFullName(firstName, lastName, middleName) {
	return `${firstName} ${lastName} ${middleName}`
}

var curriedPrintFullName = curry(printFullName, "Semen", "Semenovich", "Kostev");
console.log(curriedPrintFullName());


{

class CurriedFunction extends Function {
	constructor(f) {
		f = f.bind();
		f.__proto__ = CurriedFunction.prototype;
		return f;
	}
	
	curry(...args) {
		return this.bind(null, ...args);
	}
}

function printFullName(firstName, lastName, middleName) {
	return `${firstName} ${lastName} ${middleName}`
}

const curriedPrintFullName = new CurriedFunction(printFullName).curry("Semen", "Semenovich", "Kostev");
console.log(curriedPrintFullName());

}


В этих примерах вы можете каррировать функции с любым количеством аргументов любое количество раз.

Последний раз редактировалось Malleys, 16.06.2019 в 21:55.
Ответить с цитированием
  #6 (permalink)  
Старый 17.06.2019, 09:37
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Задача убойная На собеседовании облажаться с ней - как нефиг делать.

var curryN = (function() {
    function bind(n, arg, f) {
        return (n < 1) ? function() {
            var a = arguments;
            return f.apply(this, a.length ? arg.concat.apply(arg, a) : arg);
        } : function(a) {
            return bind(n - 1, arg.concat(a), f);
        }
    }

    return function curryN(n, f) {
        return (typeof n !== 'number' || n < 1) ? f : bind(n, [], f);
    };
})();

function func() {
    console.log(`this = ${this},  args = ${[].join.call(arguments, ', ')}`);
}

var c0func = curryN(0, func);
c0func('a0', 'b');

var c3func = curryN(3, func);
c3func('A')('B')('C')();
var c3func2 = c3func('A')('B');
c3func2('C1')(5555);
c3func2('C2').call('th', 'D', 'E');
c3func2('C3').call('th2');

var c2func = curryN(2, func);
c2func('aa')('bb')();

c3func2('__').call('th4', 5555);


Суть задачи, как я понял: есть функция f, которая может при вызове получить M параметров и с ними что-то сделать.
Например, f(1, 2, 3, 4, 5); - 5 параметров передали.

curryN(N, f) должна создать функцию cf, которая сначала по одному биндит первые N аргументов, потом результат можно вызвать с M-N оставшимися:
cf = curryN(3, f);
cf(1)(2)(3)(4, 5);

Более того, все "промежуточные" результаты - cf(1), cf(1)(2) и т.д. - можно использовать многоразово. Потому arg (накопленные аргументы) должен быть иммутабельным, никаких push и прочих сплайсов.

В идеале при этом конечном вызове надо уметь передать this в функцию f, что я и сделал.
Т.е. чтобы так можно было: cf(1)(2)(3).call(obj, 4, 5); что эквивалентно f.call(obj, 1, 2, 3, 4, 5);

Последний раз редактировалось Alexandroppolus, 17.06.2019 в 10:01.
Ответить с цитированием
  #7 (permalink)  
Старый 17.06.2019, 10:33
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Malleys,
Alexandroppolus,
спасибо, но пока для меня ваши примеры и обьяснения, слабо понятны, буду медитировать..
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
функция которая имеет любое кол-во аргументов и возращает определённого типа melnikov24 Общие вопросы Javascript 7 23.01.2020 12:22
Просмотрела исходик jQuery Откорректируйте где не верно taksebe jQuery 5 23.11.2018 22:42
Как и где задать цикл? Blondinka Events/DOM/Window 2 10.06.2014 15:29
Динамическое создание iframe в Firefox mrbean11 Firefox/Mozilla 8 02.11.2012 21:23