Процедура как результат другой процедуры
Композиция, повторение и усреднение с торможением делают поведение данными. Процедура принимает другие процедуры и возвращает новое преобразование.
Что становится возможным, когда результатом вызова процедуры является сама процедура?
- Понимание выражения lambda как значения процедуры, возвращаемого другой процедурой
- Различение построения преобразования и применения этого преобразования
- Композиция процедур в порядке, который остается видимым в исходном коде
- Построение повторяющегося поведения без копирования тела операции
- Понимание усреднения с торможением как преобразования, создающего процедуру
compose принимает два значения процедуры и возвращает новую процедуру. Вызов compose еще не возводит число в квадрат и не увеличивает его на единицу, он строит преобразование, которое сохраняет f и g. Только последующее применение передает x, вычисляет g от x и затем применяет f к этому результату. repeated использует ту же идею рекурсивно, возвращая тождественное преобразование при нуле и еще одну композицию при каждом большем числе повторений.
average-damp также возвращает процедуру. Возвращенное преобразование вычисляет исходную f для x и находит среднее значение этого результата и x. Для преобразования квадратного корня y ↦ 16/y приближение 2 становится 5, тогда как неподвижная точка 4 остается 4. Конструктор процедур содержит повторно используемый метод, а переданная f определяет преобразуемое поведение.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Программа с композицией возвращает (49 37 15). Программа с усреднением с торможением возвращает (5 4 21).
Отделите вызовы, которые создают возвращаемые процедуры, от последующих вызовов, которые их применяют. В примере с композицией сравните применение square после increment с применением increment после square. В примере с торможением найдите вызов захваченной f до вычисления среднего. Трасса выполнения фиксирует порядок вызовов и результат каждого конечного применения.
Измените программу и сравните результат.
Определите twice только через compose, затем верните как ((twice increment) 10), так и ((twice square) 3). Предположите оба значения до запуска программы.
Показать подсказку
twice должна возвращать процедуру, эквивалентную композиции f с самой собой, ожидаемые значения равны 12 и 81.