Oggi () è 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 in fase di chiamata.
Una funzione pura sarebbe int Add(int a, int b) {return a + b;}
. La funzione funziona esclusivamente con ciò che viene dato 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 nessuno stato esterno (non ha "effetti collaterali"), Aggiungi () ing 2 e 2 da adesso fino alla fine dei tempi non cambierà nient'altro nel sistema, a meno che non si assegni il risultato della funzione a una variabile o altrimenti si usi 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.
Oggi (), d'altra parte può produrre lo stesso valore quando viene chiamato due volte di seguito, ma non se viene 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 dato 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 (un cambiamento generalmente verificatosi al di fuori dei limiti del programma). / p>
Una funzione impura non è necessariamente una cosa negativa; sono richieste funzioni impure, anche in linguaggi funzionali, per interagire con qualsiasi cosa al di fuori dei confini del programma, come archivi dati, pipeline di comunicazione, display UI, periferiche, ecc. Un programma che non fa nessuna di queste cose è un programma che è strongmente limitato nella sua utilità; Mi spingerei persino a definire un programma di questo tipo insignificante, in quanto senza alcun mezzo per accettare input o vie per informarti della sua uscita, 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 esplicitamente definiti, ma questo perché il runtime sta allontanando tutti questi dettagli impuri di lavorare all'interno di un sistema informatico imperfetto, quindi che il programma stesso può essere strutturato in termini di un insieme nidificato di espressioni matematiche che il runtime valuta quindi dato un input iniziale.
È semplicemente una cosa molto buona sapere quali delle funzioni che stai usando sono pure e quali no, in modo che tu possa prendere buone decisioni su come vengono utilizzate. Funzioni impure, perché fanno cose o dipendono da cose che non sono evidenti dal loro utilizzo, possono comportarsi in modo imprevedibile dato solo la conoscenza dell'uso. È richiesta un'ulteriore conoscenza dello scopo della funzione, e quindi di cosa ha bisogno da o fa allo stato esterno, per posizionare un sistema che lo utilizza in uno stato consistente e quindi aspettarsi un risultato deterministico.