带有绑定的部分函数
Partial functions with bind
所以最近我发现你可以使用 bind 对 js 进行部分 functions/currying。
例如:
const foo = (a, b, c) => (a + (b / c))
foo.bind(null, 1, 2) //gives me (c) => (1 + (2 / c))
然而,这只有在您想要咖喱的部分是有序的情况下才有效。如果我想使用 bind 实现以下目标怎么办?
(b) => (1 + (b / 2))
尝试了各种解决方案,例如:
foo.bind(null, 1, null, 2)
有什么想法吗?是否可以使用香草 es6 来完成此操作?
您可以使用包装器对参数进行重新排序。
const
foo = (a, b, c) => a + b / c,
acb = (a, c, b) => foo(a, b, c);
console.log(acb.bind(null, 1, 2)(5));
目前我考虑了两种实现方法(除了来自@NinaSholz 的包装器,它非常好):
1。使用合并两个参数数组的 curry
函数:
const foo = (a, b, c) => a + b / c;
function curry(fn, ...args) {
return function(...newArgs) {
const finalArgs = args.map(arg => arg || newArgs.pop());
return fn(...finalArgs);
};
}
const curriedFoo = curry(foo, 1, null, 2);
console.log(curriedFoo(4)) // Should print 1 + 4 / 2 = 3
这里我们只是发送 null
或 undefined
来代替我们要跳过的参数,在第二次调用中我们按顺序发送这些参数
2。将对象用于命名参数
const foo = ({a, b, c}) => a + b / c;
function curry(fn, args) {
return (newArgs) => fn({ ...args,
...newArgs
});
}
const curriedFoo = curry(foo, {
a: 1,
c: 2
});
console.log(curriedFoo({
b: 4
}));
这里我们利用函数签名中的 ...
(展开) 运算符和对象语法来合并两个参数对象;
所以最近我发现你可以使用 bind 对 js 进行部分 functions/currying。 例如:
const foo = (a, b, c) => (a + (b / c))
foo.bind(null, 1, 2) //gives me (c) => (1 + (2 / c))
然而,这只有在您想要咖喱的部分是有序的情况下才有效。如果我想使用 bind 实现以下目标怎么办?
(b) => (1 + (b / 2))
尝试了各种解决方案,例如:
foo.bind(null, 1, null, 2)
有什么想法吗?是否可以使用香草 es6 来完成此操作?
您可以使用包装器对参数进行重新排序。
const
foo = (a, b, c) => a + b / c,
acb = (a, c, b) => foo(a, b, c);
console.log(acb.bind(null, 1, 2)(5));
目前我考虑了两种实现方法(除了来自@NinaSholz 的包装器,它非常好):
1。使用合并两个参数数组的 curry
函数:
const foo = (a, b, c) => a + b / c;
function curry(fn, ...args) {
return function(...newArgs) {
const finalArgs = args.map(arg => arg || newArgs.pop());
return fn(...finalArgs);
};
}
const curriedFoo = curry(foo, 1, null, 2);
console.log(curriedFoo(4)) // Should print 1 + 4 / 2 = 3
这里我们只是发送 null
或 undefined
来代替我们要跳过的参数,在第二次调用中我们按顺序发送这些参数
2。将对象用于命名参数
const foo = ({a, b, c}) => a + b / c;
function curry(fn, args) {
return (newArgs) => fn({ ...args,
...newArgs
});
}
const curriedFoo = curry(foo, {
a: 1,
c: 2
});
console.log(curriedFoo({
b: 4
}));
这里我们利用函数签名中的 ...
(展开) 运算符和对象语法来合并两个参数对象;