2020-01-16
描述
将一个深度为 n
的柯里化函数进行解构。
提示
- 返回一个可变的函数
- 为提供的参数使用
Array.prototype.reduce()
,让其可以逐层调用每一层的柯里化函数 - 如果提供的参数
length
小于n
的话则抛出一个错误 - 使用
Array.prototype.slice(0, n)
获取符合要求的所有参数,使其作为fn
的参数进行调用 - 第二个参数
n
的默认值为1
,表示只进行一层解构
代码
const uncurry = (fn, n = 1) => (...args) => {
const next = acc => args => args.reduce((x, y) => x(y), acc);
if (n > args.length) throw new RangeError('Arguments too few!');
return next(fn)(args.slice(0, n));
};
示例
计算累加数:
const add = x => y => z => x + y + z;
const uncurriedAdd = uncurry(add, 3);
uncurriedAdd(1, 2, 3); // 6