Uno dei principi della programmazione funzionale è l'uso delle funzioni pure. Una funzione Pure è libera da effetti collaterali e trasparente dal punto di vista referenziale.
I getter non sono referenzialmente trasparenti: se viene chiamato un Setter tra le chiamate al Getter, il valore di ritorno del Getter cambia anche se i suoi parametri non hanno (in genere nessun parametro)
I setter producono effetti collaterali - Chiamare un setter in genere 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 getter / setter come faremmo in un linguaggio come Java.
In un linguaggio come Haskell (di cui non parlo fluentemente, ma mi viene detto che è più vero per un linguaggio funzionale "Puro") Sono solo curioso di sapere come modellereste le proprietà su oggetti in modo tale che Getter sia trasparente dal punto di vista referenziale e Setter sono privi di effetti collaterali?
La soluzione sarebbe quella di restituire una copia dell'oggetto su cui è stato invocato il setter come valore di ritorno del setter e questa copia contiene la modifica al valore della proprietà?