Здравствуйте, Александр Шумилов, Вы писали:
АШ>В книге А.Филда и П.Харрисона "Функциональное программирование" на с. 73 есть пример вычисления функции энергичным и ленивым способами:
АШ>АШ>reduce (lambda (el, isthere) => if isthere then true else (N == el)), false, L)
АШ>
АШ>АШ>Вычисление заканчивается так быстро, поскольку для b никогда не требуется значения его второго аргумента, иначе говоря, b не является строгой относительно второго аргумента. Если значение первого аргумента оказывается тем числом, которое проверяется на принадлежность к списку, то второй аргумент попросту отбрасывается; такой случай и показан в выше приведенном примере, где выражение отброшенного аргумента выделено курсивом.
АШ>Я не могу понять почему для лямбда-выражения из первой приведенной функции не требуется значения второго аргумента. Насколько я понимаю в выражении if then else прежде всего должно вычилится подвыражение if. Как мы сразу попадаем в ветку else?
Хм, похоже на ошибку. Причем в том издании, которое у меня есть, она не одна — в выражении b неправильно расставлены скобки:
reduce (lambda (el, isthere)) =>
if isthere then true else ((N == el), false, L)
Если выражение пререписать как if (N==el) then true else isthere или совсем по-человечески — (N==el) or isthere, — то рассуждения будут правильными.
Вроде, я нигде не наврал.