Sto leggendo di pure-funzioni nella programmazione funzionale e mi sto chiedendo, se una funzione essendo deterministica implica che la funzione è anche senza effetti collaterali? (e viceversa?)
Puro = deterministico + senza effetti collaterali
Una funzione è pura solo se entrambi i criteri sono soddisfatti. Se ne soddisfa solo uno, non è puro.
Deterministico ma con effetti collaterali:
Come sottolineato da @Caleth
int DeterministicButSideeffects(int param)
{
Console.Writeline("Sideeffect"); // Side effect here
this.someVariable = param; // Another side effect
return param; // Result only depends on the parameters
}
Senza effetti collaterali ma non deterministici
int NonDeterministicWithoutSideeffects(int param)
{
return param + getRandomIntNumber(); // Result depends on random number
}
Nota che gli effetti collaterali sono solo "in uscita". Se una funzione modifica lo stato del codice contenente (variabile globale o campo in una classe) o se esegue alcune operazioni di I / O, ha effetti collaterali.
Un'altra funzione molto semplice che non è deterministica sarebbe:
DateTime GetCurrentDateTime()
{
return DateTime.Now; // -> Result depends on current datetime
}
Pure:
int add(int num1, int num2)
{
return num1 + num2;
}
È facile dimostrare che una funzione deterministica non implica che sia pura, con un semplice controesempio:
int DeterministicButNotPure(int param)
{
Console.Writeline("Foo invoked"); // Side effect here
return param; // Result only depends on the parameters
}
Leggi altre domande sui tag functional-programming pure-function