Cuando una función tiene varios parámetros, puede pasar algunos parámetros primero, y estos parámetros no volverán a cambiar.
Luego, devuelva una nueva función para recopilar los parámetros restantes y devuelva el resultado: esto es curry
El método de curado en adash:
Parámetro _.curry (func): la función que debe curry, y el valor de retorno es el parámetro después de curry.
const _ = require('lodash');
function getSum(a, b, c) {
return a + b + c;
}
const curried = _.curry(getSum);
console.log(curried(1, 2, 3));
console.log(curried(1)(2, 3));
console.log(curried(1, 2)(3));
const match = _.curry(function (reg, str) {
return str.match(reg)
})
const haveSpace = match(/\s+/g);
const haveNumber = match(/\d+/g);
console.log(haveSpace('hello world'));
console.log(haveNumber('123abc123'));
const filter = _.curry(function (func, array) {
return array.filter(func)
})
const findSpace = filter(haveSpace)
console.log(filter(haveSpace, ['John Connor', 'John_Donne']))
console.log(findSpace(['John Connor', 'John_Donne']))
Currying nos permite generar una nueva función, y esta nueva función tiene memorizados ciertos parámetros fijos.
Dentro de la función se forma un cierre, una especie de caché para la función.
Haga la función más flexible y reduzca la granularidad de la función.
Con el curry, puede convertir múltiples funciones en funciones unarias y puede combinar funciones para producir funciones poderosas.
Curry de escritura a mano:
function curry(func) {
return function curriedFn(...args) {
// 判断实参和形参的个数
if (args.length < func.length) {
return function () {
return curriedFn(...args.concat(Array.from(arguments)))
}
}
return func(...args)
}
}
function getSum(a, b, c) {
return a + b + c
}
const curried = curry(getSum)
console.log(curried(1, 2, 3))
console.log(curried(1)(2)(3))