L'un des principes de la programmation fonctionnelle est l'utilisation de fonctions pures. Une fonction Pure est une fonction sans effets secondaires et transparente par référence.
Les Getters ne sont pas référentiellement transparents - si un Setter est appelé entre des appels au Getter, la valeur de retour du Getter change même si ses paramètres ne l'ont pas (généralement pas de paramètres)
Les setters produisent des effets secondaires - L'appel d'un Setter manipule généralement une valeur qui n'est pas sa valeur de retour (en fait, traditionnellement, un setter ne renvoie rien)
Je sais qu'à Scala, nous acceptons simplement le fait que nous entremêlons deux paradigmes (fonctionnels et orientés objet) et utilisons des getters / setters comme nous le ferions dans un langage comme Java.
Dans un langage comme Haskell (avec lequel je ne parle pas couramment, mais on me dit que c'est plus vrai pour un langage fonctionnel "pur"), je suis juste curieux de savoir comment vous modéliseriez des propriétés sur des objets tels que les Getters sont référentiellement transparents et les Setters les effets secondaires sont-ils libres?
La solution consisterait-elle à renvoyer une copie de l'objet sur lequel le setter a été invoqué comme valeur de retour du setter, et cette copie contient la modification de la valeur de la propriété?
Réponses:
Exactement. Voir la méthode des classes de cas
copy
ou le concept général des lentilles.En particulier, si l'état doit changer, vous utiliserez une monade d'État. Des changements à cette monade d'état peuvent être effectués à travers des lentilles, ce qui facilite l'extraction d'informations de "l'état" et leur changement facile.
Voir aussi cette question sur le problème général qui vient d'une structure profonde comme «état» et y apporter des modifications. Les réponses ont de bons liens sur les lentilles et les fermetures à glissière si vous voulez approfondir cela.
la source
Eh bien, dans Haskell, les objets sont (généralement) immuables, donc les getters (que vous obtenez lorsque vous utilisez la syntaxe d'enregistrement) ou les fonctions qui agissent comme des getters sont référentiellement transparents. Et puis, vous ne "définissez" pas de valeurs sur les objets - au contraire, vous créez un nouvel objet similaire à l'ancien, mais avec une valeur différente pour l'un des champs. C'est aussi une fonction pure.
la source
"Les getters et setters ont l'objet comme paramètre - même s'il est généralement implicite - les getters sont donc référentiellement transparents. - delnan"
La transparence référentielle signifie que la fonction renvoie TOUJOURS la même sortie pour les mêmes entrées; donc si un attribut d'objet a été modifié par un setter, vous ne retournez pas la même sortie. :)
la source