Esiste una definizione canonica della funzione "pura"?


9

StackOverflow mi ha indicato qui, quindi la domanda potrebbe essere un po 'nei termini di un laico.

Wikipedia definisce funzioni pure come

Nella programmazione al computer, una funzione può essere descritta come una funzione pura se entrambe queste affermazioni sulla funzione contengono:

  1. La funzione valuta sempre lo stesso valore di risultato dati gli stessi valori di argomento. Il valore del risultato della funzione non può dipendere da alcuna informazione o stato nascosto che può cambiare man mano che procede l'esecuzione del programma o tra diverse esecuzioni del programma, né può dipendere da alcun input esterno dai dispositivi I / O.
  2. La valutazione del risultato non provoca alcun effetto collaterale o output osservabile semanticamente, come la mutazione di oggetti mutabili o l'output a dispositivi I / O.

Tuttavia, non sembra citare alcuna fonte, quindi è difficile dire se si tratta di una definizione accettata o chi l'ha definita in questo modo.

Quando guardo cosa fanno le lingue quando includono una sintassi / annotazione per funzioni "pure", ci sono diversi approcci:

  1. In D l'unica limitazione è la non mutazione dello stato globale. Le funzioni "pure" possono mutare i suoi argomenti.
  2. In GCC ci sono due tipi di "puro": pure(nessun effetto collaterale, ma può leggere lo stato globale) e const(rigorosamente puro come da definizione di Wikipedia).
  3. In C # , è definito come "non apporta alcun cambiamento di stato visibile" (qualunque esso sia).
  4. Haskell segue la definizione di Wikipedia.

Quindi la mia domanda è: esiste una definizione canonica di pura funzione?
E se c'è, qual è la sua fonte?


Prospettiva storica correlata , sebbene nessuno sembri dare alcuna risposta definita o di provenienza.
Guildenstern,

1
Non vale la pena rispondere, ma ecco la mia definizione: se x = y (per definizione) allora fx = fy è vero e f non provoca alcun cambiamento misurabile esternamente nello stato (cioè ogni cambiamento di stato è interno a x, y, e f). Haskell ne approfitta. Implementa la valutazione pigra mutando i thunk e sostituendoli con funzioni che restituiscono immediatamente il risultato. Cioè se si valuta (fx) potrebbe effettivamente cambiare fec sotto il cofano ma non si può mai dire.
Jake,

Risposte:


3

Come notato in questo documento Imperative Functional Programming , (1993) di Peyton-Jones e Wadler (tra il gruppo di ricercatori che hanno creato Haskell):

Ci concentriamo su soluzioni puramente funzionali, che escludono gli effetti collaterali, per due motivi. In primo luogo, l'assenza di effetti collaterali consente l'uso senza restrizioni del ragionamento equazionale e della trasformazione del programma ...

l'attenzione è rivolta all'assenza di effetti collaterali per consentire le trasformazioni del programma (ad es. ottimizzazioni del compilatore).

Quali sono gli effetti collaterali? Questo articolo indica a sua volta l' integrazione della programmazione funzionale e imperativa (1986) di Gifford e Lucassen, che menziona quattro tipi di classi di effetti : Puro, Funzione, Osservatore e Procedura. Quindi, il termine "funzione pura" deriva da questo documento.

  • un PURO è referenzialmente trasparente: non causa effetti collaterali, il suo valore non è influenzato da effetti collaterali e restituisce lo stesso valore ogni volta che viene valutato.

Si noti, tuttavia, che Peyton-Jones e Wadler hanno menzionato carenze in questo approccio. Vale la pena notare, dicono, è il linguaggio di programmazione Clean che utilizza tipi lineari per introdurre effetti collaterali in modo sicuro (cioè sicuro per il compilatore). Fondamentalmente, filtra il mondo come una variabile in tutte le funzioni relative agli I / O, incluso il punto di ingresso principale .

Con ciò, è possibile avere un linguaggio funzionale puro che interagisca con il mondo e abbia effetti collaterali (I / O, il sistema operativo, il sistema Windowing, ecc.), Contraddicendo parzialmente la tua definizione di Wikipedia. Si può infatti affermare che Haskell ha Clean come uno dei suoi influenzatori; sebbene si discosti dai tipi lineari e utilizzi un altro costrutto a livello di tipo (monadi) per garantire la linearità, ovvero un riferimento singolo in ogni momento.


"Fondamentalmente, infila il mondo come una variabile ...". Intendi davvero "discussioni". Esiste un resoconto informale di questo sul web?
babou,

Ho usato "threading" come metafora. Significa che devi passare la variabile World da una funzione all'altra. E la tipizzazione lineare significa che tale variabile mondiale non viene utilizzata più di una volta. Implica, ad esempio, che per aprire un file all'interno di una funzione che vorresti fare (f_handle, world2) = fopen file_name, world(pseudocodice) e che dovrai usare una chiamata successiva world2. In sostanza i programmi sono visti come operare sul l' universo nel suo insieme. In altre
parole

Threading the World, come dici tu, sembra essere il modo standard (come ricordo) di gestire l'ambiente nella semantica denotazionale. Quindi il punto chiave deve essere la linearità. Tuttavia, si suppone che la semantica denotazionale (DS) sia puramente funzionale, senza alcun vincolo di linearità. Immagino che DS sia un'astrazione matematica e non abbia scrupoli nel destreggiarsi tra molti mondi. Il calcolo è fisico e la linearità consente l'evoluzione mondiale, ma può esistere un solo Mondo alla volta (che probabilmente sequenzia la valutazione). Qual è la semantica di 2 programmi Clean eseguiti contemporaneamente :-)?
babou,

Il documento di Gifford e Lucassen è accessibile sul web?
babou,

Ho avuto accesso attraverso la Uni.
carlosayam,

-1

La definizione di Wikipedia è canonica. I due requisiti cruciali sono:

  • Il valore restituito e il comportamento della funzione sono una funzione deterministica degli argomenti che sono stati esplicitamente passati alla funzione.

  • Un'invocazione della funzione non ha effetti collaterali osservabili.

A rigor di termini, D e gcc non dovrebbero usare la parola "puro" come fanno loro; è un abuso della terminologia standard.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.