Today () è una funzione impura perché il suo risultato dipende da qualcosa che non gli dai; in particolare, l'ora corrente del sistema. Pertanto, il suo risultato non è deterministico se basato solo sugli input forniti all'invocazione.
Una pura funzione sarebbe int Add(int a, int b) {return a + b;}
. La funzione funziona esclusivamente con ciò che viene fornito e non utilizza altri dati di stato esterni. Il risultato naturale di questo è che puoi Add(2,2)
e ottenere 4 da ora fino alla fine dei tempi. Inoltre, poiché la funzione non cambia alcuno stato esterno (non ha "effetti collaterali"), Aggiungi () ing 2 e 2 da ora fino alla fine dei tempi non cambierà nient'altro nel sistema, a meno che tu assegnare il risultato della funzione a una variabile o utilizzare in altro modo il valore per aggiornare lo stato (che non è un'operazione eseguita dalla funzione stessa). Praticamente tutte le operazioni matematiche classiche sono funzioni pure e possono essere implementate come tali.
Today (), d'altra parte, può produrre lo stesso valore quando viene chiamato due volte di seguito, ma non se chiamato ripetutamente per diversi giorni. Questo perché dipende da dati di stato esterni che non vengono forniti dall'utente come parametro della funzione. Di conseguenza, è impossibile, entro i limiti del programma, controllare il risultato della funzione Today (). Produrrà un determinato valore in un determinato giorno e non produrrà mai quel valore in nessun altro giorno, a meno che non si modifichi l'orologio di sistema del computer su cui viene eseguito (una modifica che si verifica generalmente al di fuori dei limiti del programma).
Una funzione impura non è necessariamente una cosa negativa; sono necessarie funzioni impure, anche in linguaggi funzionali, per interagire con qualsiasi cosa al di fuori dei confini del programma, come archivi dati, condutture di comunicazione, display dell'interfaccia utente, dispositivi periferici, ecc. Un programma che non fa nulla di tutto ciò è un programma questo è fortemente limitato nella sua utilità; Andrei persino al punto di definire banale un programma del genere, poiché senza alcun mezzo per accettare input o vie per informarti del suo output, potrebbe anche non fare nulla. I programmi scritti in linguaggi funzionali possono avere solo l'input fornito dal runtime e produrre un output segnalato al runtime senza metodi impuri definiti in modo esplicito, ma questo perché il runtime sta sottraggendo tutti questi dettagli impuri del lavoro all'interno di un sistema informatico imperfetto,
È semplicemente una cosa molto buona sapere quali delle funzioni che stai usando sono pure e quali no, in modo da poter prendere delle buone decisioni su come vengono utilizzate. Le funzioni impure, poiché fanno cose o dipendono da cose che non sono evidenti dal loro uso, possono comportarsi in modo imprevedibile, data la sola conoscenza dell'uso. Sono necessarie ulteriori conoscenze sullo scopo della funzione, e quindi su ciò di cui ha bisogno da o verso uno stato esterno, al fine di posizionare un sistema che lo utilizza in uno stato coerente e quindi aspettarsi un risultato deterministico.