Многоразовая подстановка

Pavel Vetokhin
2 min readNov 15, 2018

--

Идеальный мир

Во многих языках программирования существует мир чистых (pure) функций и мир операций с побочными эффектами (side effects).

Например, изменение некоторого мутабельного состояния считается побочным эффектом. Такие операции часто называют update-in-place, и они всегда имеют сигнатуру, которая вообще ни о чем не говорит. Например unit -> unit, IO() -> IO() или даже void -> void.

Ну очевидно же, что операций с побочными эффектами должно быть как можно меньше, а чистых функций — как можно больше.

Мир побочных эффектов

Но! В каждый язык (в т.ч. функциональные) встроена как минимум одна update-in-place операция. И это подстановка (substitution) значений на место переменных.

При каждом вызове (application) инстанцируется тело функции, и затем аргументы подставляются на место переменных.

На вход операции подстановки поступает тело функции, размеченное переменными, и соответствующие аргументы, а на выходе получается выражение с выполненной подстановкой.

Ничего не напоминает?

На входе у нас состояние, размеченное местами, и соответствующие им значения, а на выходе — состояние с выполненной подстановкой.

Существуют и другие примеры функционального update-in-place:

  1. Внедрение зависимостей в иммутабельные объекты
  2. Конструирование иммутабельных структур данных
  3. Вставка новых элементов в структуры данных

Многоразовая подстановка

Операции с побочными эффектами подозрительно походят на операции подстановки. Разница лишь в том, что подстановка — одноразовая операция. После её выполнения информация о местах “стирается”, и выполнить подстановку повторно уже нельзя.

Но! Вычисления всегда конструктивны. Любая конструкция всегда занимает некоторое место. Вычисления без побочных эффектов просто-напросто невозможны. Побочные эффекты суть многоразовая подстановка, где многоразовость мест обусловлена ограниченностью ресурсов. Без побочных эффектов получается лишь пародия на вычисления, что-то типа игры в бисер.

--

--