with second promises objects for elegant edition async array javascript higher-order-functions pure-function

javascript - second - La función de orden superior devuelve la función pura.



javascript elegant (3)

Sí, la función que se devuelve, puede considerarse pura. La razón por la que se considera pura, es porque la función siempre devolverá la misma salida dada la misma entrada exacta.

Este es un ejemplo de una función de orden superior llamada functionA que tiene customValue como entrada y devuelve una función que obtiene una entrada y usa el valor personalizado para elaborar un resultado:

let functionA = (customValue) => { let value = customValue || 1; return input => input * value; };

Aquí hay algunos resultados:

functionA()(4) // => returns 4 functionA(2)(4) // => returns 8 functionA(3)(4) // => returns 12 functionA(4)(4) // => returns 16

¿Puede la función devuelta por functionA ser considerada pura?

ACTUALIZACIÓN : los ejemplos anteriores solo usan entrada numérica. Como lo describe @CRice, la función devuelta puede considerarse pura solo cuando customValue es constante y no tiene un estado interno (como clases).


Sus funciones devueltas pueden ser consideradas como función pura. En tu ejemplo, tienes efectivamente 4 funciones puras diferentes.

const pureFunc1 = functionA(); pureFunc1(4) // => returns 4 pureFunc1(4) // => returns 4 const pureFunc2 = functionA(2); pureFunc2(4) // => returns 8 pureFunc2(4) // => returns 8 // ...


Usando esta definición de función pura :

En la programación de computadoras, una función pura es una función que tiene las siguientes propiedades:

  1. Su valor de retorno es el mismo para los mismos argumentos (sin variación con variables estáticas locales, variables no locales, argumentos de referencia mutables o flujos de entrada de dispositivos de E / S).

  2. Su evaluación no tiene efectos secundarios (ninguna mutación de variables estáticas locales, variables no locales, argumentos de referencia mutables o flujos de E / S).

Entonces, no , functionA no siempre devolverá una función pura.

Aquí hay una forma de usar functionA para que no devuelva una función pura:

let functionA = (customValue) => { let value = customValue || 1; return input => input * value; }; class Mutater { constructor() { this.i = 0; } valueOf() { return this.i++; } } const nonPureFunction = functionA(new Mutater()); // Produces different results for same input, eg: not pure. console.log(nonPureFunction(10)); console.log(nonPureFunction(10));

Como puede ver, la función devuelta, cuando se le da la misma entrada ( 10 ), produce un resultado diferente. Esto viola la primera condición de la definición anterior (y si usa el mismo truco, también podría violar la segunda).