Estoy leyendo ahora mismo el código fuente de Ramda y no entiendo el punto de _curry1() .
function _curry1(fn) { return function f1(a) { if (arguments.length === 0 || _isPlaceholder(a)) { return f1; } else { return fn.apply(this, arguments); } }; }Las funciones que se procesan con esta función se pueden llamar sin argumentos.
const inc = (n) => n + 1 const curriedInc = _curry1(inc) // now it can be called like this curriedInc(1) // => 2 curriedInc()(1) // => 2 // but it works only with no arguments provided const add = (a, b) => a + b const curriedAdd = _curry1(add) curriedAdd(1) // => NaN curriedAdd(1)(1) // => TypeError: curriedAdd(...) is not a function curriedAdd() // => function f1(a) Pregunta : Me parece que no puedes encadenar argumentos con esta función en absoluto. ¿Cuáles son los casos de uso de esta función? ¿Qué tan diferente es curriedInc()(1) de inc(1) ?
_curry1 , _curry2 y _curry3 son trucos para mejorar el rendimiento que no se pueden usar en la función pública de curry . Ramda (descargo de responsabilidad: soy un autor) los usa para realizar varias tareas, claramente principalmente haciendo el currículo, pero también verificando los marcadores de posición para que podamos hacer correctamente alguna aplicación parcial. La otra cosa mágica sobre el curry de Ramda es la forma en que puede aplicar todos, algunos o incluso ninguno de los argumentos requeridos, y mientras no estemos completos, obtiene otra función buscando los restantes.
Obviamente _curry1 teóricamente no debería ser necesario, pero hace que sea más fácil agregar este tipo de consistencia:
const a = curry ((a, b, c) => ...) a (1, 2, 3) == a (1, 2) (3) == a (1) (2, 3) == a (1) (2) (3) == a () () (1, 2) () (3)Fíjate en eso último. Cuando llama a una función curry que aún busca argumentos sin ningún argumento, obtiene la misma función.
curry1 es lo que hace que eso suceda; agrega consistencia. Pero eso es todo para lo que es.