web-dev-qa-db-fra.com

Différence entre fonction pure et fonction impure?

J'ai supposé que les fonctions pures doivent toujours avoir un type de retour (c'est-à-dire, ne doivent pas être void) et doivent avoir la même sortie quel que soit l'état de l'objet et que les fonctions Impure changent l'état de l'objet ou affichent l'état de l'objet.

Mais le manuel que j'utilise indique que:

Un accesseur contient généralement une instruction return, mais une méthode qui imprime des informations sur l'état d'un objet peut également être classée en tant qu'accesseur.

Je suis confus. Laquelle est correcte?

MODIFIER

Un peu de clarification, la chose qui me fait demander est cette question: 

La dernière question est de " Indiquez le type de fonction utilisé ", et les personnes qui ont fait des commentaires ont indiqué qu'il s'agissait d'une fonction impure en cours d'impression.

Alors, cette fonction est-elle pure ou impure?

12
Amith KK

Contenu extrait de ce lien

Caractéristiques de la fonction pure:

  1. La valeur de retour des fonctions pures dépend uniquement de ses arguments Ainsi, si vous appelez les fonctions pures avec le même jeu d'arguments, vous obtiendrez toujours les mêmes valeurs de retour.

  2. Ils n'ont pas d'effets secondaires comme les appels réseau ou base de données

  3. Ils ne modifient pas les arguments qui leur sont transmis

Caractéristiques des fonctions impures

  1. La valeur de retour des fonctions impures ne dépend pas uniquement de ses arguments Par conséquent, si vous appelez les fonctions impures avec le même jeu d'arguments, vous pouvez obtenir les différentes valeurs de retour Par exemple, Math .random (), Date.now ()

  2. Ils peuvent avoir des effets secondaires comme des appels réseau ou de base de données

  3. Ils peuvent modifier les arguments qui leur sont transmis

function impureFunc(value){
  return Math.random() * value;
}

function pureFunc(value){
  return value * value;
}

var impureOutput = [];
for(var i = 0; i < 5; i++){
   impureOutput.Push(impureFunc(5));
}

var pureOutput = [];
for(var i = 0; i < 5; i++){
   pureOutput.Push(pureFunc(5));
}

console.log("Impure result: " + impureOutput); // result is inconsistent however input is same. 

console.log("Pure result: " + pureOutput); // result is consistent with same input

25
A.T.

De Wikipedia - une fonction peut être décrite comme une fonction pure si ces deux déclarations concernant la fonction sont:

  1. La fonction évalue toujours la même valeur de résultat avec la même valeur d'argument. La valeur du résultat de la fonction ne peut dépendre d'aucune information cachée ni d'aucun état susceptible de changer au fur et à mesure de l'exécution du programme ou entre différentes exécutions du programme, ni des entrées externes provenant des périphériques d'E/S.
  2. Évaluation du résultat ne provoque aucune observation sémantique effet secondaire ou sortie, tels que la mutation d'objets mutables ou la sortie vers des périphériques d'E/S.

Par conséquent, si l'une des déclarations est fausse par rapport à votre code, elle est impure.

8
Elliott Frisch

Mu. Vous semblez supposer qu'un accesseur est une fonction pure par définition. Ce n'est pas nécessairement le cas - un accesseur (même un get- accesseur renvoyant une valeur) peut être impur, tel que la méthode get de LinkedHashMap en mode de commande d'accès (qui déplace l'entrée demandée à la dernière position dans l'ordre d'itération).

3
Jeffrey Hantin

Les deux instructions sont correctes.

Lorsque vous créez des méthodes pour obtenir une valeur, appelées ACCESSOR METHODS  

Ex:

public String getName(){
    return this.name;
}

et pour la valeur de réglage, nous utilisons des méthodes avecVOIDqui s'appellent MUTATOR METHODS

Ex:

public void setName(String n){
    this.name=n;
}
2
CoderCroc

Les fonctions impures ou les méthodes de mutation modifient l'état de l'objet et les valeurs stockées dans les variables d'instance.

1
Amiya Upadhyay