Uno de los principios de la programación funcional es el uso de funciones puras. Una función pura es aquella que no tiene efectos secundarios y es referencialmente transparente.
Los getters no son referencialmente transparentes: si se llama a un Setter entre llamadas al Getter, el valor de retorno del Getter cambia aunque sus parámetros no lo hayan hecho (normalmente no hay parámetros)
Los setters producen efectos secundarios: llamar a un setter normalmente manipula un valor que no es su valor de retorno (de hecho, tradicionalmente un setter no devuelve nada)
Sé que en Scala simplemente aceptamos el hecho de que estamos combinando dos paradigmas (funcionales y orientados a objetos) y usamos getters / setters como lo haríamos en un lenguaje como Java.
En un lenguaje como Haskell (con el que no soy fluido, pero me dicen que es más cierto que un lenguaje funcional "Puro") tengo curiosidad por saber cómo modelaría propiedades en objetos de modo que los Getters sean referencialmente transparentes y Setters son libres de efectos secundarios?
¿Sería la solución devolver una copia del objeto sobre el que se invocó al establecedor como el valor de retorno del establecedor, y esta copia contiene el cambio al valor de la propiedad?