Voici un exemple de fonction d'ordre supérieur appelée functionA qui a customValue en entrée et retourne une fonction qui obtient une entrée et utilise la valeur personnalisée pour élaborer un résultat:
let functionA = (customValue) => {
let value = customValue || 1;
return input => input * value;
};
Voici quelques résultats:
functionA()(4)
// => returns 4
functionA(2)(4)
// => returns 8
functionA(3)(4)
// => returns 12
functionA(4)(4)
// => returns 16
La fonction retournée par functionA peut-elle être considérée comme pure?
UPDATE: les exemples ci-dessus utilisent uniquement une entrée numérique. Comme décrit par @CRice, la fonction renvoyée ne peut être considérée comme pure que lorsque customValue est constante et n'a pas d'état interne (comme les classes).
Utilisation de cette définition de fonction pure :
En programmation informatique, une fonction pure est une fonction qui a le propriétés suivantes:
Sa valeur de retour est la même pour les mêmes arguments (pas de variation avec Variables statiques locales, variables non locales, arguments mutuels de référence modifiables Ni flux d’entrée provenant de périphériques d’E/S).
Son évaluation a pas effets secondaires (pas de mutation de variables statiques locales, variables non locales, arguments de référence modifiables ou flux d'E/S).
Alors, no, functionA
ne retournera pas toujours une fonction pure.
Voici un moyen d'utiliser functionA
pour qu'il ne retourne pas une fonction pure:
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));
Comme vous pouvez le constater, la fonction renvoyée, lorsqu'elle reçoit la même entrée (10
), produit un résultat différent. Ceci viole la première condition de la définition ci-dessus (et en utilisant le même truc, vous pourriez également violer la seconde).
Oui, la fonction renvoyée peut être considérée comme pure. La raison pour laquelle elle est considérée comme pure est que la fonction retournera toujours la même sortie avec exactement la même entrée.
Vos fonctions retournées peuvent être considérées comme des fonctions pures. Dans votre exemple, vous avez effectivement 4 fonctions pures différentes.
const pureFunc1 = functionA();
pureFunc1(4) // => returns 4
pureFunc1(4) // => returns 4
const pureFunc2 = functionA(2);
pureFunc2(4) // => returns 8
pureFunc2(4) // => returns 8
// ...