一行代码实现curry化

     之前写过curry化的原理和实现,详情请看这里https://blog.csdn.net/daydream13580130043/article/details/83718978

里面提到了用es6一行写curry化

const curry = (fn, n = fn.length, args = []) => n === 0 ? fn(...args) : (...args1) => curry(fn, n - args1.length, [...args, ...args1]);

回去仔细想想其实curry函数的n这个参数是多余的,也就是这样写会更简单点

const curry = (fn,args = []) => args.length === fn.length ? fn(...args) : (...args1) => curry(fn,[...args,...args1]);

原理还是一样,只不过n这个参数完全可以用args这个参数代替,然后在判断递归是否到头只需比较args.length === fn.length即可

再来个TypeScript的实现(除了加了类型,其他都没变)

const Curry: (fn: Function, args?: Array<any>) => any = (fn: Function, args: Array<any> = []): any => args.length === fn.length ? fn(...args) : (...args1: Array<any>):any => Curry(fn, [...args, ...args1]);

猜你喜欢

转载自blog.csdn.net/daydream13580130043/article/details/84618230