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, время: 09:30. |