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?
fuente
Respuestas:
Exactamente. Ver método de clase de caso
copy
, o el concepto general de lentes.En particular, si el estado necesita un cambio, usaría una mónada estatal. Los cambios a esa mónada de estado se pueden hacer a través de lentes, lo que hace que extraer información del "estado" y cambiarlo sea fácil.
Vea también esta pregunta sobre el problema general que proviene de una estructura profunda como "estado" y hacer cambios en él. Las respuestas tienen buenos enlaces tanto en lentes como en cremalleras si quieres profundizar en eso.
fuente
Bueno, en Haskell, los objetos son (generalmente) inmutables, por lo que los captadores (que se obtienen cuando se usa la sintaxis de registro) o las funciones que actúan como captadores son referencialmente transparentes. Y luego no "establece" valores en los objetos; en todo caso, crea un nuevo objeto que es similar al anterior, pero con un valor diferente para uno de los campos. Esta también es una función pura.
fuente
"Los captadores y establecedores tienen el objeto como parámetro, aunque generalmente es implícito, por lo que los captadores son referencialmente transparentes. - delnan"
Referencialmente transparente significa que la función SIEMPRE devuelve la misma salida para las mismas entradas; entonces, si un setter ha cambiado un atributo de objeto, no está devolviendo el mismo resultado. :)
fuente