Programmazione funzionale: l'uso di un generico rende impura una funzione?

2
    public static Func<string, Task<T>> MyMethod<T>(
        UserCredentials credentials,
        Func<string, string, string, Task<T>> func
    ) =>
        async (value) => await func(credentials.user, credentials.pwd, value);

Ho difficoltà a discernere la purezza della funzione, perché ovviamente T(int) genera un output diverso come T(string) . Oppure la purezza dipende da T(int) = 5 sempre risultante in 10 e T(string) ="Foo" che risulta sempre in "Bar"?

    
posta Yatrix 23.02.2018 - 18:43
fonte

2 risposte

7

Or does the purity depend on T(int) = 5 always resulting in 10 and T(string) = "Foo" always resulting in "Bar"?

Sì.

Un parametro di tipo è ancora uno dei parametri di input della funzione, anche se non risiede tra parentesi della funzione. La definizione di una funzione pura è che, dati gli stessi valori per i suoi parametri di input, produrrà comunque lo stesso risultato (senza effetti collaterali).

    
risposta data 23.02.2018 - 18:57
fonte
3

Utilizzando la definizione di Pure Function da wikipedia , una funzione è pura se:

  1. La funzione valuta sempre lo stesso valore di risultato dato lo stesso valore di argomento. Il valore del risultato della funzione non può dipendere da informazioni o stati nascosti che possono cambiare durante l'esecuzione del programma o tra diverse esecuzioni del programma, né può dipendere da qualsiasi ingresso esterno dai dispositivi I / O (di solito, vedere sotto).
  2. La valutazione del risultato non causa alcun effetto collaterale semanticamente osservabile o output, come la mutazione di oggetti mutabili o l'output su dispositivi I / O (di solito, vedi sotto).

Ci sono due modi in cui penso che tu possa guardare a questo: 1. il parametro type T fa parte della definizione della funzione o fa parte dell'input alla funzione. Ad ogni modo, non penso che sia importante per determinare se la funzione è pura.

    
risposta data 23.02.2018 - 19:00
fonte

Leggi altre domande sui tag