Um dos princípios da programação funcional é o uso de funções puras. Uma função Pure é aquela que é livre de efeitos colaterais e é referencialmente transparente.
Os Getters não são referencialmente transparentes - se um Setter é chamado entre as chamadas para o Getter, o valor de retorno do Getter muda mesmo que seus parâmetros não (normalmente nenhum parâmetro)
Os setters produzem efeitos colaterais - chamar um setter normalmente manipula um valor que não é seu valor de retorno (na verdade, tradicionalmente, um setter não retorna nada)
Eu sei que em Scala nós apenas aceitamos o fato de estarmos juntando dois paradigmas (funcional e orientado a objetos) e usamos getters / setters como faríamos em uma linguagem como Java.
Em uma linguagem como Haskell (com a qual eu não sou fluente, mas me dizem que é mais fiel a uma linguagem funcional "Pura"), estou curioso para saber como você modelaria propriedades em objetos de forma que Getters sejam referencialmente transparentes e Setters são livres de efeitos colaterais?
A solução seria devolver uma cópia do objeto no qual o setter foi chamado como o valor de retorno do setter, e essa cópia contém a alteração no valor da propriedade?
fonte
Respostas:
Exatamente. Veja o método da classe de caso
copy
ou o conceito geral de lentes.Em particular, se o estado precisar mudar, você usaria uma mônada do estado. Alterações nessa mônada de estado podem ser feitas através de lentes, o que facilita a extração de informações do "estado" e a alteração fácil.
Veja também esta pergunta sobre o problema geral que vem de uma estrutura profunda como "estado" e faz alterações nele. As respostas têm bons links nas lentes e nos zíperes, se você quiser se aprofundar nisso.
fonte
Bem, em Haskell, os objetos são (geralmente) imutáveis; portanto, os getters (que você obtém ao usar a sintaxe do registro) ou as funções que agem como getters são referencialmente transparentes. E então você não "define" valores nos objetos - se criar algo novo, semelhante ao antigo, mas com um valor diferente para um dos campos. Essa também é uma função pura.
fonte
"Getters e setters têm o objeto como parâmetro - mesmo que geralmente esteja implícito -, portanto, getters são referencialmente transparentes. - delnan"
Referencialmente transparente significa que a função SEMPRE retorna a mesma saída para as mesmas entradas; portanto, se um atributo de objeto tiver sido alterado por um setter, você não retornará a mesma saída. :)
fonte