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 или еще что. Прошу статью или код. Благодарю! |
:-? подожду переводчика или код.
|
Написать функцию curryN, которая каррирует N-е количество аргументов переданной функции
function printFullName(firstName, lastName, middleName) { console.log(`${firstName}${lastName}${middleName}`) } const curriedPrintFullName = curryN(3, printFullName); curriedPrintFullName('Semen')('Semenovich')('Kostev') Само задание. А нужно сделать функцию которая каррирует N-е количество аргументов переданной функции |
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') |
Каррирование: из фукнкции типа (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()); } В этих примерах вы можете каррировать функции с любым количеством аргументов любое количество раз. |
Задача убойная :) На собеседовании облажаться с ней - как нефиг делать.
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); |
Malleys,
Alexandroppolus, спасибо, но пока для меня ваши примеры и обьяснения, слабо понятны, буду медитировать.. :) |
Часовой пояс GMT +3, время: 08:09. |