Esto está bien y funciona:
const power = (x,n) => { if (n === 0) return 1; return x * power(x, n - 1); }potencia(4,3) 64
Pero tratar de hacer esto como experimento, no funciona, da NaN. No entiendo por qué:
nodo .editor // Entrar en modo editor (Ctrl+D para finalizar, Ctrl+C para cancelar)
const power = x => { return n => { if (n === 0) return 1; return x * power(x, n - 1); } }sea t = potencia(4) t(3) NaN
No ha convertido la llamada recursiva en la versión curry a forma curry. power(x, n - 1) es esencialmente lo mismo que power(x) porque power solo acepta un argumento, y esta es una función, por lo que no sin razón se convierte en NaN cuando intentas multiplicarlo por un número.
Reescríbelo así en su lugar:
const power = x => { return n => { if (n === 0) return 1; return x * power(x)(n - 1); } }; console.log('4^3 = ', power(4)(3)); // 64 console.log('2^10 = ', power(2)(10)); // 1024 console.log('5^4 = ', power(5)(4)); // 625 console.log('3^4 = ', power(3)(4)); // 81Puede almacenar la función anidada y devolver la función y usar esta función para otra llamada con solo la n modificada.
const power = x => { const fn = n => n === 0 ? 1 : x * fn(n - 1); return fn; }; console.log(power(4)(3));Como estamos discutiendo formas de funciones "extrañas", también podría contribuir con mi valor de dos centavos:
También puede hacer la función curry como una sola línea como esta:
const power = (x,pow) => pow = n => --n ? x*pow(n) : x; console.log(power(3)(4)); // 81Esto es, por supuesto, algo que nadie en su sano juicio haría jamás. Aún así, ¡funciona!