Il semble que lorsque vous lisez quelque chose comme cet article Wikipedia sur les "fonctions pures" , ils citent Today()
en exemple une fonction impure, mais cela me semble assez pur. Est-ce parce qu'il n'y a pas d'argument d'entrée formel? Pourquoi l’heure du jour n’est-elle pas traitée comme une "entrée de la fonction", auquel cas, si vous lui avez donné la même entrée, c’est-à-dire exécutée today()
deux fois à la même heure, ou si vous avez voyagé dans le temps pour l'exécuter à nouveau (peut-être une hypothèse: )), la sortie serait la même heure. Today()
ne vous donne jamais un nombre aléatoire. il vous donne toujours l'heure du jour.
L'article de Wikipédia dit "des moments différents donneront des résultats différents", mais c'est comme si vous disiez pour différentes x
sin(x)
vous donnerait des ratios différents. Et sin(x)
est leur exemple d'une fonction pure.
Réponses:
C'est parce que la sortie dépend de quelque chose qui n'est pas une entrée, à savoir l'heure actuelle.
Parce que vous ne l'avez pas passé en paramètre. Si vous le transmettiez en tant que paramètre, la fonction deviendrait une fonction d'identité à la date, ce qui est plutôt inutile. L’intérêt d’une
Today()
fonction est de produire quelque chose qui dépend d’une valeur externe (heure) qui change constamment.L'avantage des fonctions pures réside dans le fait que leur comportement est absolument reproductible et déterministe, ce qui facilite l'obtention de preuves formelles et de garanties fermes. Ils font toujours la même chose.
Today()
est à peu près le contraire: il fait toujours (en tenant compte de la granularité temporelle) quelque chose de différent.la source
Today()
)Today()
devient impur. LaToday()
fonction pourrait être un peu un exemple stupide. Une fonction peut être plus appropriéeCount()
. Donner le même nombre d'éléments à compterCount()
retournera toujours le même nombre, mais comme il est hors de portée,Count()
il est impur.count()
sur la plupart des langages de programmation est définitivement pur. Il a une valeur d'entrée explicite: la collection dont vous souhaitez compter le nombre. Ne soyez pas dérouté par une syntaxe telle quemyCollection.count()
; c'est juste du sucre pourcount(myCollection)
.sin(x)
retournera toujours la même valeur, tant qu'ellex
reste la même.Today()
peut renvoyer des résultats différents dans le temps, car cela dépend de valeurs hors de votre contrôle . Par exemple, si quelque chose au-delà du contrôle de votre programme change le système interne du système$current_datetime
pendant que votre programme est en cours d'exécution, les résultatsToday()
seront soudainement différents.la source
Today()
reviendrait "jeudi" un lundi.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 pouvezAdd(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.
la source
Il semble assez évident que cette fonction échoue au premier test de pureté donné au tout début de cette page:
Notez que comme il ne nécessite aucun argument, il n’existe qu’un seul ensemble de valeurs d’argument: l’ensemble vide. Et cette fonction peut et retourne des résultats différents pour la même 'valeur (s) d'argument'.
En outre, la valeur du résultat de la fonction ne dépend « cachée ... état qui peut changer à mesure que l'exécution du programme ». Donc, un autre échec.
la source
() => 1
serait une fonction pure, car elle retourne toujours 1.Today()
peut retourner "lundi" ou "mardi" ou presque toute autre valeur.Une autre façon de penser est que les fonctions pures ne dépendent pas de l'état. Le monde est généralement considéré comme un état. Vous devez connaître l'état de réalité pour savoir quel jour nous sommes.
Cependant, vous n'avez besoin de rien savoir de particulier sur l'état du monde pour savoir ce que
sin(x)
c'est. Et chaque appel àsin(x)
pour une donnéex
retournera la même valeur.la source
Date(timestamp)
serait une fonction pure. En raison de son idempotence. Et parce qu'il n'y aurait aucun effet secondaire.Today()
peut varier le résultat en fonction du moment où vous l'appelez. C'est ce qui le rend impur. Ce n'est pas idempotent. Cela n'a cependant aucun effet secondaire, mais cela ne le rend pas pur.la source
Voici un petit pseudo-code auquel je pense en discutant de fonctions pures
Si cela fonctionne indéfiniment et qu'il ne peut jamais déclencher l'assertion, c'est une fonction pure. Plus encore, si vous avez une fonction qui utilise des arguments, alors une petite modification ....
Si vous pouvez utiliser cela après chaque affectation de variable dans votre application et que cela ne change pas les résultats dans votre application, et que l'assertion ne peut jamais échouer, alors c'est une fonction pure.
la source
Premièrement, il n’existe pas de fonction sans argument (ni de tableau sans index ni de mappe sans clé). C'est la caractéristique qui définit une fonction de mapper une ou plusieurs valeurs d'argument sur une autre valeur.
Par conséquent,
today
soit n'est pas une fonction du tout, donc pas de fonction pure. Ou on peut interpréter la syntaxeun peu pour que cela signifie
En Haskell, par exemple, ceci serait valide:
car il y a un type () avec une valeur unique ().
La question est seulement, comment peut
today
calculer le jour de la semaine, si seulement il a ()? Ce n'est tout simplement pas possible sans lire la minuterie du système, directement ou via des fonctions d'assistance impures.Le minuteur système est un excellent exemple d'état global.
la source
Le problème
today()
est que cela peut donner un résultat différent s'il est appelé deux fois ou plus dans une fonction.Voici un exemple de code pouvant introduire un bogue.
C'est possible dans l'exemple ci-dessus. Que la deuxième
if
déclaration ne sera pas exécutée. Même si le premier l'a fait. Laisser une ressource en mauvais état.la source
Pour être une fonction pure, fournir les mêmes paramètres doit donner le même résultat à chaque fois.
Chaque fois que nous appelons
Today()
, nous lui fournissons les mêmes paramètres (aucun) et n'obtenons pas nécessairement le même résultat (lundi, mardi, etc.).la source