soy nuevo en curry pero tengo un problema que no puedo resolver.
function curry(func) { return date1=>{ return date2=>{ return date3=>{ return func(date1,date2,date3); }; }; }; } function format_date(a,b,c){ return a+ "." + b +"."+c; } var date= curry(format_date); console.log(date(1)(12)(2020)); console.log(date(1,12)(2020)); console.log(date(1)(12, 2020)); console.log(date(1,12, 2020)); la salida de todos los registros debe ser 1.12.2020 pero solo obtengo el primer retorno correcto [Function(anonymous)]
Puede tomar una función de doble curry para entregar los parámetros y argumentos recopilados.
Este enfoque permite utilizar la date con parámetros independientes.
function curry(func) { const fn = p => (...args) => { const parameters = [...p, ...args]; if (parameters.length >= func.length) return func(...parameters); return fn(parameters); }; return fn([]); } function format_date(a, b, c) { return a + "." + b + "." + c; } var date = curry(format_date); console.log(date(1)(12)(2020)); console.log(date(2, 12)(2020)); console.log(date(3)(12, 2020)); console.log(date(4, 12, 2020));Currying es un aspecto muy importante de la programación funcional. JS, una vez, estaba destinado a progresar en la dirección funcional, pero luego cambiaron de opinión. Junto con toda su capacidad funcional, está listo para desarrollarse en el camino imperativo una vez más. La gente casi se olvida de volverse funcional en JS. Hoy en día ves a todo el mundo abrazando la async await en lugar de las promesas monádicas. Triste.
Lo que sea; volviendo a su pregunta, por supuesto, en JS puede curry una función incluso si tiene un número ilimitado de argumentos.
var curry = f => f.length ? (...a) => curry(f.bind(f,...a)) : f(),Eso es todo..!
Si su función para ser curry es;
function format_date(a,b,c){ return a+ "." + b +"."+c; }Entonces veámoslos en acción;
function format_date(a, b, c) { return a + "." + b + "." + c; } var curry = f => f.length ? (...a) => curry(f.bind(f,...a)) : f(), fDate = curry(format_date); console.log(fDate(2021)(11)(30));