Многие ответы относятся к таким вещам, как бесконечные списки и выигрыш в производительности от неоцененных частей вычислений, но этого не хватает большей мотивации для лени: модульности .
Классический аргумент изложен в широко цитируемой статье Джона Хьюза «Почему функциональное программирование имеет значение» (ссылка в формате PDF) . Ключевым примером в этой статье (раздел 5) является игра в крестики-нолики с использованием алгоритма поиска альфа-бета. Ключевой момент (стр. 9):
[Ленивая оценка] делает практичным модульную программу как генератор, который создает большое количество возможных ответов, и селектор, который выбирает подходящий.
Программа Tic-Tac-Toe может быть написана как функция, которая генерирует все игровое дерево, начиная с заданной позиции, и отдельная функция, которая его использует. Во время выполнения это по сути не генерирует целое дерево игры, а только те его части, которые действительно нужны потребителю. Мы можем изменить порядок и комбинацию, в которой производятся альтернативы, путем изменения потребителя; нет необходимости менять генератор вообще.
На нетерпеливом языке вы не можете написать это таким образом, потому что вы, вероятно, потратили бы слишком много времени и памяти на создание дерева. Таким образом, вы в конечном итоге либо:
- Объединение производства и потребления в одну функцию;
- Написание производителя, который работает оптимально только для определенных потребителей;
- Реализация собственной версии лени.