Что ж, попробуйте придумать что-нибудь, что сработало бы, если бы лениво оценивалось, а не если бы жадно оценивалось.Наиболее распространенной категорией из них будет ленивая оценка логического оператора, используемая для сокрытия «побочного эффекта».Я буду использовать язык C # -ish для объяснения, но функциональные языки будут иметь аналогичные аналоги.
Возьмем простую лямбду C #:
(a,b) => a==0 || ++b < 20
В языке с ленивым вычислением, если a == 0, выражение ++ b <20 не оценивается (поскольку все выражение в любом случае оценивается как true), что означает, что b не увеличивается.Как в императивном, так и в функциональном языках это поведение (и аналогичное поведение оператора AND) можно использовать для «скрытия» логики, содержащей побочные эффекты, которые не должны выполняться: в данном случае </p>
(a,b) => a==0 && save(b)
«a»может быть количество ошибок проверки.Если были ошибки проверки, первая половина терпит неудачу, а вторая половина не оценивается.Если ошибок валидации не было, оценивается вторая половина (которая включает в себя побочный эффект попытки сохранить b), и результат (очевидно, истинный или ложный) возвращается для оценки.Если какая-либо из сторон оценивается как false, лямбда возвращает false, указывая, что b не был успешно сохранен.Если бы это оценивалось «с нетерпением», мы бы попытались сохранить независимо от значения «а», что, вероятно, было бы плохо, если бы ненулевое «а» указывало, что мы не должны.
Побочные эффекты в функционалеязыки обычно считаются нет-нет.Тем не менее, существует несколько нетривиальных программ, которые не требуют хотя бы одного побочного эффекта;как правило, нет другого способа интеграции функционального алгоритма с нефункциональным кодом или с такими периферийными устройствами, как хранилище данных, дисплей, сетевой канал и т. д.