Supponiamo di avere queste due F # funzioni:Come capire se una funzione F # è pura?
let sq x = x*x
let tm = DateTime.Now
sq Chiaramente è puro in quanto verrà sempre restituisce lo stesso valore per un dato ingresso mentre tm è impuro perché restituirà un valore diverso ogni volta che viene chiamato .
In generale c'è un modo per determinare se una particolare funzione in F # è pura o impura senza analizzare ciò che fa, in altre parole la si legge riga per riga?
In alternativa c'è un modo per annotare una funzione per dire al compilatore che la funzione è pura o impura quando la scrivi?
Infine quando si chiama una funzione che fa parte del Common Language Runtime (come DateTime) come si può dire se è pura o impura senza provarla?
Nota: da "puro" intendo la definizione da Wikipedia: http://en.wikipedia.org/wiki/Pure_function (permalink)
Nella programmazione di computer, una funzione può essere descritto come puro se entrambi queste affermazioni circa la funzione Hold:
La funzione valuta sempre lo stesso valore di risultato dato lo stesso valore valore/i. Il valore del risultato della funzione non può dipendere da qualsiasi informazione o stato nascosto che può cambiare come esecuzione del programma proventi o tra diverse esecuzioni del programma, né può dipendere da qualsiasi ingresso esterno dai dispositivi I/O.
Valutazione del risultato non causa alcun effetto osservabile semanticamente o lato uscita , come mutazione di oggetti mutabili o uscita ai dispositivi di I/O.
Quando dici puro, intendi davvero idempotente? O vuoi dire che non provoca effetti collaterali? –
Ah, quindi Wikipedia dice entrambi. Giusto.FWIW, non penso che Microsoft offra alcun tipo di annotazione o attributo che segni funzioni come "puro ..." Devi solo sapere. –
Potresti anche trovare le risposte a questa domanda http://stackoverflow.com/questions/4391524/is-returning-a-random-value-from-function-a-side-effect che vale la pena leggere. –