Одним из принципов функционального программирования является использование чистых функций. Функция Pure - это функция, которая не имеет побочных эффектов и прозрачна по ссылкам.
Получатели не являются ссылочно прозрачными - если метод вызова вызывается между вызовами метода получения, возвращаемое значение метода получения изменяется, даже если его параметры не изменяются (как правило, параметров нет)
Сеттеры вызывают побочные эффекты. Вызов сеттера обычно манипулирует значением, которое не является его возвращаемым значением (фактически, обычно сеттер ничего не возвращает)
Я знаю, что в Scala мы просто любезно принимаем тот факт, что мы объединяем две парадигмы (функциональную и объектно-ориентированную) и используем геттеры / сеттеры, как в языке, подобном Java.
В таком языке, как Haskell (с которым я не бегло говорю, но мне говорят, что это более справедливо по отношению к «чистому» функциональному языку), мне просто любопытно, как бы вы смоделировали свойства объектов таким образом, чтобы Getters были ссылочно прозрачными и Setters Побочные эффекты свободны?
Будет ли решение возвращать копию объекта, для которого вызывался установщик, в качестве возвращаемого значения установщика, и эта копия содержит изменение значения свойства?
Ответы:
Точно. Смотрите метод case case
copy
или общую концепцию линз.В частности, если нужно изменить штат, вы бы использовали монаду штата. Изменения в монаду этого состояния можно вносить с помощью линз, что облегчает извлечение информации из «состояния» и ее изменение.
См. Также этот вопрос об общей проблеме, которая исходит от такой глубокой структуры, как «состояние» и внесение в нее изменений. Ответы содержат хорошие ссылки на линзы и молнии, если вы хотите углубиться в это.
источник
Что ж, в Haskell объекты (как правило) являются неизменяемыми, поэтому методы получения (которые вы получаете при использовании синтаксиса записи) или функции, которые действуют как методы получения, являются прозрачными по ссылкам. И тогда вы не «устанавливаете» значения для объектов - если что-то создаете новый объект, который похож на старый, но с другим значением для одного из полей. Это тоже чистая функция.
источник
«Получатели и установщики имеют объект в качестве параметра - даже если он обычно неявный - так что получатели являются ссылочно прозрачными. - delnan»
Прозрачная ссылка означает, что функция ВСЕГДА возвращает одинаковые выходные данные для одних и тех же входных данных; поэтому, если атрибут объекта был изменен установщиком, вы не возвращаете тот же результат. :)
источник