У меня есть вопрос относительно чистых функций. Согласно странице Википедии, один из необходимых компонентов для чистой функции:
Оценка результата не вызывает какого-либо семантически наблюдаемого побочного эффекта или вывода, такого как мутация изменяемых объектов или вывод на устройства ввода-вывода.
Теперь, что это действительно значит. Или, скорее, как я могу сделать побочный эффект, который не является семантически наблюдаемым?
functional-programming
semantics
Хенрик Соммерланд
источник
источник
Ответы:
Семантика программы - это модель ее поведения, которая, как и любая научная модель, игнорирует аспекты, которые вы не хотите изучать.
Чрезвычайно подробная модель выполнения программы будет моделировать физическое поведение компьютера, на котором она выполняется, включая время выполнения, энергопотребление, электромагнитное излучение и т. Д. Такие аспекты очень редко принимаются во внимание, поскольку они очень редко актуальны. Тем не менее, они иногда имеют значение: полезная модель автопилота самолета должна включать информацию о времени выполнения, полезная модель безопасности кредитной карты должна включать электромагнитное излучение, ...
В типичной семантике такие побочные эффекты, как синхронизация и энергопотребление, игнорируются. Даже если в обычной настройке, где вы вводите выражение в приглашении интерпретатора Haskell, печать результата является побочным эффектом (если вы пытаетесь распечатать бесконечный объект, это имеет значение). Если интерпретатору Haskell не хватает памяти, это также является наблюдаемым побочным эффектом в модели «реального мира», но не в идеализированной модели Haskell, которая эффективно допускает неограниченные вычисления.
Наблюдаемый побочный эффект является тем , которая моделируется в семантике. В типичных моделях языков программирования потребление памяти не моделируется, поэтому вычисления, для которых требуется 1 ТБ памяти, могут быть чистыми, даже если вы попытаетесь запустить их на своем ПК, это может привести к сбоям.
Другой вид ненаблюдаемого побочного эффекта - тот, который является внутренним для функции. Это то, о чем думает большинство семантиков, говоря о ненаблюдаемых побочных эффектах. Рассмотрим вычисление, которое использует изменяемые данные внутри себя, но не разделяет эти изменяемые данные с какой-либо другой частью программы. Например, функция сортировки списка, которая создает массив с теми же элементами, что и список, сортирует массив на месте и возвращает список, содержащий элементы в виде массива в их окончательном порядке: семантическая модель подвыражений этой функции демонстрирует сторону эффекты (модификации массива), но сама функция не имеет внешних побочных эффектов, поэтому она чистая.
Для более тонкого примера рассмотрим функцию, которая записывает некоторые данные во временный файл и очищает после себя. В семантике, где всегда достаточно места для временных файлов, а программы не разделяют временные файлы, функция не имеет побочного эффекта; временный файл действует как дополнительная память, используемая функцией. В семантике, которая учитывает полные условия файловой системы, функция имеет побочный эффект - она может завершиться ошибкой из-за внешних обстоятельств. В семантике, которая позволяет машине аварийно завершить работу, функция имеет побочный эффект: если во время выполнения функции происходит сбой, временный файл может остаться позади. В семантике, которая позволяет одновременно выполняемым программам видеть и, возможно, изменять временный файл, функция имеет побочный эффект.
источник