web-dev-qa-db-fra.com

La fonction d'ordre supérieur renvoie la fonction pure

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).

19
pnknrg

Utilisation de cette définition de fonction pure :

En programmation informatique, une fonction pure est une fonction qui a le propriétés suivantes:

  1. 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).

  2. 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).

23
CRice

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.

1
Brandon Kirk

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

// ...
0
engineforce