Ленивая семантика: вопрос.
От: Александр Шумилов  
Дата: 09.06.06 08:00
Оценка:
В книге А.Филда и П.Харрисона "Функциональное программирование" на с. 73 есть пример вычисления функции энергичным и ленивым способами:


reduce (lambda (el, isthere) => if isthere then true else (N == el)), false, L)


Поиск числа 1 при энергичном вычислении (лямбда-выражение обозначено b):


reduce (b, false, [1, 3, 5, 7])
== b(1, b(3, b(5, b(7, false)))) (по определению функции reduce)
-> b(1, b(3, b(5, false)))
-> b(1, b(3, false))
-> b(1, false)
-> true



При ленивом вычислении:


reduce (b, false, [1, 3, 5, 7])
-> b(1, reduce(b, false, [3, 5, 7]))
-> true



Далее комментарий:


Вычисление заканчивается так быстро, поскольку для b никогда не требуется значения его второго аргумента, иначе говоря, b не является строгой относительно второго аргумента. Если значение первого аргумента оказывается тем числом, которое проверяется на принадлежность к списку, то второй аргумент попросту отбрасывается; такой случай и показан в выше приведенном примере, где выражение отброшенного аргумента выделено курсивом.


Определение reduce:


reduce(f, b, nil) <= b
reduce(f, b, x::l) <= f(x, reduce(f, b, l))


Я не могу понять почему для лямбда-выражения из первой приведенной функции не требуется значения второго аргумента. Насколько я понимаю в выражении if then else прежде всего должно вычилится подвыражение if. Как мы сразу попадаем в ветку else?

----
Александр Шумилов
Re: Ленивая семантика: вопрос.
От: Programmierer AG  
Дата: 09.06.06 09:05
Оценка:
Здравствуйте, Александр Шумилов, Вы писали:

АШ>В книге А.Филда и П.Харрисона "Функциональное программирование" на с. 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, — то рассуждения будут правильными.
Вроде, я нигде не наврал.
Re[2]: Ленивая семантика: вопрос.
От: Трурль  
Дата: 09.06.06 11:34
Оценка:
Здравствуйте, Programmierer AG, Вы писали:

PA>Если выражение пререписать как if (N==el) then true else isthere или совсем по-человечески — (N==el) or isthere, — то рассуждения будут правильными.

PA>Вроде, я нигде не наврал.
Про скобки наврал, а остальное, вроде, правильно.
Re[3]: Ленивая семантика: вопрос.
От: Programmierer AG  
Дата: 09.06.06 11:59
Оценка:
Здравствуйте, Трурль, Вы писали:

Т>Про скобки наврал, а остальное, вроде, правильно.

Внесу ясность про скобки: я считаю правильным вариант
reduce (lambda (el, isthere) => if isthere then true else (N == el)), false, L)

То, что я привел в ответе — цитата из книги (издание Москва "Мир" 1993, стр. 73,
скачал у Мошкова).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.