Domanda

I termini sembrano essere definito diversamente, ma ho sempre pensato a un implicare l'altro; Non riesco a pensare a nessun caso in cui un'espressione è referenzialmente trasparente ma non pura o viceversa.

Wikipedia mantiene articoli separati per questi concetti e dice:

Da Trasparenza referenziale:

Se tutte le funzioni coinvolte nell'espressione sono funzioni pure, l'espressione è referenzialmente trasparente. Inoltre, alcune funzioni impure possono essere incluse nell'espressione se i loro valori vengono scartati e i loro effetti collaterali sono insignificanti.

Da Espressioni pure:

Sono necessarie funzioni pure per costruire espressioni pure. [...] Le espressioni pure sono spesso definite referenzialmente trasparenti.

Trovo queste dichiarazioni confuse. Se gli effetti collaterali di una cosiddetta "funzione impura" sono insignificante abbastanza per consentire di non eseguirli (cioè sostituire una chiamata a tale funzione con la sua valore) Senza cambiare materialmente il programma, è lo stesso che fosse puro in primo luogo, no?

Esiste un modo più semplice per comprendere le differenze tra una pura espressione e una referenzialmente trasparente, se presente? Se c'è una differenza, un'espressione di esempio che dimostra chiaramente che sarebbe apprezzata.

È stato utile?

Soluzione

Se raccolgo in un posto tre teorici della mia conoscenza, almeno due di loro non sono d'accordo sul significato del termine "trasparenza referenziale". E quando ero un giovane studente, un mio mentore mi ha dato un documento spiegando che anche se si considera solo la letteratura professionale, la frase "referenzialmente trasparente" è usata per significare almeno tre cose diverse. (Sfortunatamente quel documento è da qualche parte in una scatola di ristampe che devono ancora essere scansionate. Ho cercato Google Scholar ma non ho avuto successo.)

Non posso informarti, ma io Potere Consigliati di rinunciare: perché anche il piccolo gruppo di teorici del linguaggio a testatura non può essere d'accordo su cosa significhi, il termine "referenzialmente trasparente" è inutile. Quindi non usarlo.


PS su qualsiasi argomento a che fare con la semantica dei linguaggi di programmazione, Wikipedia è inaffidabile. Ho smesso di provare a risolverlo; Il processo di Wikipedian sembra considerare il cambiamento e il voto popolare sulla stabilità e l'accuratezza.

Altri suggerimenti

Tutte le funzioni pure sono necessariamente referenzialmente trasparenti. Poiché, per definizione, non possono accedere a nient'altro che a ciò che vengono superati, il loro risultato deve essere completamente determinato dai loro argomenti.

Tuttavia, è possibile avere funzioni referenzialmente trasparenti che non sono pure. Posso scrivere una funzione che viene data un int i, quindi genera un numero casuale r, sottrae r da se stesso e lo mette in s, quindi ritorna i - s. Chiaramente questa funzione è impura, perché sta generando numeri casuali. Tuttavia, è referenzialmente trasparente. In questo caso, l'esempio è sciocco e inventato. Tuttavia, ad esempio, Haskell, il id La funzione è di tipo a - > a mentre il mio stupidId La funzione sarebbe di tipo a -> IO a indicando che utilizza gli effetti collaterali. Quando un programmatore può garantire mezzi di una prova esterna che la loro funzione è effettivamente referenzialmente trasparente, allora può usare unsafePerformIO per spogliare il IO indietro lontano dal tipo.

Non sono sicuro della risposta che do qui, ma sicuramente qualcuno ci punterà in una direzione. :-)

La "purezza" è generalmente considerata "mancanza di effetti collaterali". Si dice che un'espressione sia pura se la sua valutazione manca di effetti collaterali. Cos'è un effetto collaterale allora? In un linguaggio puramente funzionale, l'effetto collaterale è tutto ciò che non è accompagnato dalla semplice regola beta (la regola che per valutare l'applicazione delle funzioni è la stessa che sostituisce il parametro effettivo per tutte le libertà del parametro formale).

Ad esempio, in un linguaggio funzionale con lineare (o unicità, questa distinzione non dovrebbe disturbare in questo momento) è consentita una mutazione (controllata).

Quindi immagino che abbiamo risolto ciò che potrebbe essere "purezza" e "effetti collaterali".

La trasparenza referenziale (secondo l'articolo di Wikipedia che hai citato) significa che la variabile può essere sostituita dall'espressione che indica (abbreviate, rappresenta) senza cambiare il significato del programma a portata di mano (btw, questa è anche una domanda difficile da affrontare e affronta Non tenterò di farlo qui). Quindi, la "purezza" e la "trasparenza referenziale" sono davvero cose diverse: "purezza" è una proprietà di una certa espressione significa approssimativamente "non produce effetti collaterali quando eseguite" mentre la "trasparenza referenziale" è una proprietà che correla variabile e espressione Stabilisce e significa che "la variabile può essere sostituita con ciò che indica".

Spero che questo aiuti.

Queste diapositive da un discorso Accu2015 Avere un grande riepilogo sull'argomento della trasparenza referenziale.

Da una delle diapositive:

Un linguaggio è referenzialmente trasparente se (a) ogni sottoespressione può essere sostituita da qualsiasi altra uguale ad esso in valore e (b) tutte le occorrenze di un'espressione all'interno di un determinato contesto producono lo stesso valore.

È possibile avere, ad esempio, una funzione che registra il suo calcolo all'output standard del programma (quindi non sarà una funzione pura), ma è possibile sostituire le chiamate per questa funzione con una funzione simile che non ne registra il calcolo . Pertanto, questa funzione ha il trasparenza referenziale proprietà. Ma ... la definizione di cui sopra riguarda le lingue, non le espressioni, come sottolineano le diapositive.

...] È lo stesso che fosse puro in primo luogo, no?

Dalle definizioni che abbiamo, no, non lo è.

Esiste un modo più semplice per comprendere le differenze tra una pura espressione e una referenzialmente trasparente, se presente?

Provare le diapositive che ho menzionato sopra.

Citerò ciò che John Mitchell ha scritto nel suo libro Concetto nel linguaggio di programmazione. Non ricordo che la linea per riga ma definisce che il linguaggio funzionale puro deve superare il test del linguaggio dichiarativo che è:

"Nell'ambito della decelerazione specifica di x1, ..., xn, tutte le occorrenze di un'espressione e contenenti solo variabili x1, ..., xn hanno lo stesso valore."

In breve, come tutti gli altri menzionavano liberi da effetti collaterali o nessun effetto collaterale ("mancanza" di effetti collaterali).

In linguistica una frase di nome o sostantivo è considerata referenzialmente trasparente se può essere sostituita con l'altra frase sostantivo con lo stesso referente senza cambiare il significato della frase che contiene.

Che nel primo caso vale, ma in 2 ° caso diventa troppo strano.

Caso 1: "Ho visto Walter entrare nel suo nuovo macchina."

E se Walter possiede un centro, potremmo sostituirlo nella frase data come:

"Ho visto Walter entrare nel suo Centro"

Contrariamente al primo:

Caso n. 2: è stato chiamato William Rufus A causa della sua barba di lettura.

Rufus significa che un po 'rosso e il riferimento era a Guglielmo IV d'Inghilterra.

"È stato chiamato William IV a causa della sua barba di lettura. "Sembra troppo imbarazzante.

Il modo tradizionale di dire è che una lingua è referenzialmente trasparente se possiamo sostituire un'espressione con un'altra pari valore ovunque nel programma senza cambiare il significato del programma.

Pertanto, la trasparenza referenziale è una proprietà del linguaggio funzionale puro. E se il tuo programma è privo di effetti collaterali, questa proprietà manterrà.

Quindi rinunciare è un consiglio fantastico, ma metterlo su potrebbe anche avere un bell'aspetto in questo contesto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top