title: Fonction pure
text: # Fonction pure
  
  En programmation informatique, une fonction pure est une fonction qui possède les propriétés $suivantes^,$ :
  
  * Sa valeur de retour est la même pour les mêmes arguments (pas de variation avec des variables statiques locales, des variables non locales, des arguments mutables de type référence ou des flux d'entrée).
  * Son évaluation n'a pas d'effets de bord (pas de mutation de variables statiques locales, de variables non locales, d'arguments mutables de type référence ou de flux d'entrée-sortie).
  
  Une fonction pure est ainsi un analogue informatique d'une fonction mathématique. Certains auteurs, particulièrement de la communauté des langages impératifs, utilisent le terme "pure" pour désigner les fonctions qui ont uniquement la propriété 2 susmentionnée.
  
  ## Exemples
  
  ### Fonctions pures
  
  Les fonctions C++ suivantes sont pures :
  
  * floor, retournant la partie entière par défaut d'un nombre ;
  * max, retournant le maximum de deux valeurs ;
  * sin, retournant le sinus d'un nombre.
  
  ### Fonctions impures
  
  Les fonctions C++ suivantes sont impures car elles ne vérifient pas la propriété 1 ci-dessus :
  
  * à cause de la variation de la valeur de retour avec une variable non locale
  
      int f { return x; }
  * à cause de la variation de la valeur de retour avec un argument mutable de type référence
  
      int f(int* x) { return *x; }
  * à cause de la variation de la valeur de retour avec un flux d'entrée
  
      int f { int x = 0; std::cin >> x; return x; }
  
  Les fonctions C++ suivantes sont impures car elles ne vérifient la propriété 2 ci-dessus :
  
  * à cause de la mutation d'une variable statique locale
  
      void f { static int x = 0; ++x; }
  * à cause de la mutation d'une variable non locale
  
      void f { ++x; }
  * à cause de la mutation d'un argument mutable de type référence
  
      void f(int* x) { ++*x; }
  * à cause de la mutation d'un flux de sortie
  
      void f { std::cout << "Hello, world!" << std::endl; }
  