Что означает «чистота» в функциональном программировании, если приложение изменяет стек?

Мы знаем, что чистые функции:

  1. Всегда возвращайте один и тот же результат для заданного ввода
  2. Не вызывают побочных эффектов

Это приводит нас к ссылочной прозрачности, где выражение может быть заменено значением без изменения поведение программы.

Это говорит нам о том, что программу можно назвать чисто функциональной, если она исключает деструктивные модификации. (обновления) объектов в рабочей среде программы.

Этот комментатор написал:

борясь с тем, что на самом деле означает «чистый» в настройках FP, учитывая, что само приложение является протоколом для мутации (стека)

Мой вопрос: Что означает «чистота» в функциональном программировании, если приложение изменяет стек?


comment
То же, что означало бы, если бы стека не существовало? Стек — это просто деталь реализации, и он не должен иметь значения при определении «чистой» функции.   -  person andars    schedule 11.03.2016


Ответы (1)


Тот факт, что функция изменяет стек, является следствием реализации машины. Это не имеет значения для определения чистоты, так же как не имеет значения тот факт, что использование «значения» требует изменения регистра в ядре процессора.

Если функция не мутирует (или не зависит) от чего-либо внешнего по отношению к ее собственному фрейму стека (например, глобальные переменные, ввод-вывод, случайность), ее все равно можно рассматривать как чистую.

person andars    schedule 11.03.2016
comment
Можно ли реализовать машину, которая не мутирует стек? - person hawkeye; 11.03.2016
comment
Конечно, могут быть реализации, которые не мутируют «стек» или даже не имеют стека, но я почти уверен, что физическая машина, которая что-то вычисляет, будет мутировать (хотя я бы хотел услышать, что я ошибаюсь ). - person andars; 11.03.2016
comment
Не могли бы вы указать на такую ​​реализацию мутирующей машины без стека? - person hawkeye; 11.03.2016
comment
Должны ли быть подпрограммы? :) Я не уверен, что именно вы ищете, но вы можете попробовать RS08 (который не имеет системного стека/указателя стека), python без стека (который в значительной степени все еще имеет стек, он просто в куче), и cps (что может быть реализован с использованием системного стека или кучи). - person andars; 11.03.2016