Getter e setter in linguaggi funzionali

9

Uno dei principi della Programmazione Funzionale è l'uso delle Pure Functions. Una funzione Pura è quella che è senza effetti collaterali e referenzialmente trasparente.

Getters non sono referenzialmente trasparenti - se un Setter viene chiamato tra le chiamate al Getter, il valore di ritorno del Getter cambia anche se i suoi parametri non lo sono (in genere nessun parametro)

I setter producono effetti collaterali - Chiamare un Setter tipicamente manipola un valore che non è il suo valore di ritorno (in effetti, tradizionalmente un setter non restituisce nulla)

So che in Scala accettiamo semplicemente il fatto che stiamo mettendo insieme due paradigmi (funzionali e orientati agli oggetti) e usiamo i getter / setter come faremmo in un linguaggio come Java.

In una lingua come Haskell (che non conosco bene, ma mi è stato detto che è più vero per un linguaggio funzionale "puro"), sono solo curioso di sapere come modellare le proprietà sugli oggetti in modo tale che Getters sia referenziale trasparente e Setter sono senza effetto collaterale?

La soluzione sarebbe di restituire una copia dell'oggetto su cui il setter è stato invocato come valore di ritorno del setter e questa copia contiene la modifica al valore della proprietà?

    
posta ThaDon 27.07.2011 - 20:06
fonte

3 risposte

7

Esattamente. Vedi metodo case class copy o il concetto generale di lenti.

In particolare, se lo stato ha bisogno di cambiare, dovresti usare una monade di stato. Le modifiche a tale stato possono essere eseguite tramite obiettivi, il che rende l'estrazione di informazioni da "stato" e la modifica facile.

Vedi anche questa domanda sul problema generale che proviene da una struttura profonda come "stato" e che apporta modifiche ad esso . Le risposte hanno buoni collegamenti su entrambi gli obiettivi e chiusure lampo se si vuole approfondire.

    
risposta data 27.07.2011 - 20:22
fonte
11

Bene, in Haskell, gli oggetti sono (di solito) immutabili, quindi i getter (che si ottengono quando si utilizza la sintassi del record) o le funzioni che si comportano come getter sono referenzialmente trasparenti. E poi non si "impostano" i valori sugli oggetti - se qualcosa si crea un oggetto nuovo che è simile a quello vecchio, ma con un valore diverso per uno dei campi. Questa è anche una funzione pura.

    
risposta data 28.07.2011 - 08:19
fonte
-1

"I getter ei setter hanno l'oggetto come parametro - anche se di solito è implicito - quindi i getter sono referenzialmente trasparenti." delnan "

Referentially transparent significa che la funzione ALWAYS restituisce la stessa uscita per gli stessi input; quindi se un attributo oggetto è stato modificato da un setter, non si restituisce lo stesso output. :)

    
risposta data 27.07.2011 - 22:37
fonte

Leggi altre domande sui tag