Tutte le funzioni deterministiche sono prive di effetti collaterali (e viceversa)?

3

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?)

    
posta user66875 15.03.2017 - 11:24
fonte

2 risposte

11

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;
}
    
risposta data 15.03.2017 - 14:58
fonte
4

È 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
}
    
risposta data 15.03.2017 - 11:27
fonte

Leggi altre domande sui tag