Today () est une fonction impure car son résultat dépend de quelque chose que vous ne lui donnez pas. spécifiquement, l'heure système actuelle. Par conséquent, son résultat n'est pas déterministe lorsqu'il est basé uniquement sur les entrées fournies lors de l'appel.
Une fonction pure serait int Add(int a, int b) {return a + b;}
. La fonction fonctionne uniquement avec ce qui est donné et n'utilise aucune autre donnée d'état externe. Le résultat naturel de cela est que vous pouvez Add(2,2)
obtenir 4 à partir de maintenant et jusqu'à la fin des temps. De plus, comme la fonction ne modifie aucun état externe (elle n’a aucun "effet secondaire"), Add () ing 2 et 2 à partir de maintenant jusqu’à la fin des temps ne changera rien d’autre dans le système, sauf si affectez le résultat de la fonction à une variable ou utilisez autrement la valeur pour mettre à jour l'état (qui n'est pas une opération effectuée par la fonction elle-même). Pratiquement toutes les opérations mathématiques classiques sont des fonctions pures et peuvent être implémentées en tant que telles.
Today (), en revanche, peut produire la même valeur lorsqu'il est appelé deux fois de suite, mais pas s'il est appelé à plusieurs reprises pendant plusieurs jours. En effet, cela dépend des données d'état externes qui ne vous sont pas fournies en tant que paramètre de la fonction. Par conséquent, il est impossible, dans les limites du programme, de contrôler le résultat de la fonction Today (). Il produira une valeur donnée un jour donné et ne produira jamais cette valeur un autre jour, à moins que vous ne modifiiez l'horloge système de l'ordinateur sur lequel il est exécuté (changement se produisant généralement en dehors des limites du programme).
Une fonction impure n'est pas nécessairement une mauvaise chose. des fonctions impures sont nécessaires, même dans les langages fonctionnels, pour interagir avec tout ce qui est en dehors du programme, comme des magasins de données, des pipelines de communication, des affichages d'interface utilisateur, des périphériques, etc. Un programme qui ne fait rien de tout cela est un programme cela est fortement limité dans son utilité; J'irais même jusqu'à appeler un tel programme trivial, car sans aucun moyen d'accepter une entrée ou une avenue pour vous informer de sa sortie, il pourrait tout aussi bien ne rien faire. Les programmes écrits dans des langages fonctionnels ne peuvent avoir que les entrées fournies par le moteur d’exécution et produire une sortie rapportée au moteur d’exécution sans méthode impure explicitement définie, mais c’est parce que le moteur d’exécution détourne tous ces détails impurs du travail dans un système informatique imparfait,
C'est simplement une très bonne chose de savoir quelles fonctions que vous utilisez sont pures et lesquelles ne le sont pas, afin que vous puissiez prendre les bonnes décisions quant à la façon dont elles sont utilisées. Les fonctions impures, parce qu'elles font des choses ou dépendent de choses qui ne sont pas apparentes dans leur utilisation, peuvent se comporter de manière imprévisible si elles ne connaissent que leur utilisation. Une connaissance supplémentaire de l'objectif de la fonction, et donc de ce dont elle a besoin ou ce qu'il fait à un état externe, est nécessaire pour placer un système qui l'utilise dans un état cohérent et ainsi obtenir un résultat déterministe.