В предыдущей главе мы осознали важную проблему, возникающую при подстановке. Тут поговорим подробнее о методе решения этой проблемы.
α-конверсия
Имя связанной переменной — не более чем метка: и — одна и та же функция.
Особо одарённые товарищи от возни с переименованием избавляются и используют индексы де Брёйна: сами лямбды остаются, но становятся безымянными, а каждое вхождение переменной записывается числом — сколько лямбд нужно пройти от него вверх до связывателя (отсчёт с нуля, — ближайшая охватывающая лямбда). Тогда α-эквивалентные термы получают одинаковую запись, и α-конверсия как понятие исчезает.
- → (единственная переменная указывает на свою лямбду);
- → ( стало , а — ).
η-конверсия
На самом деле это совсем мелочь, но всё равно надо коротко сказать. η-конверсия говорит, что «обёртка» ничем не отличается от самого .
η-редукция сворачивает такую обёртку влево, а η-экспансия разворачивает её вправо.
В Haskell это знакомый point-free стиль:
sum xs = foldr (+) 0 xs
-- превращается в
sum = foldr (+) 0