Итак, я потратил много времени на чтение и повторное чтение финала главы 9 в The Little Schemer, где прикладной Y combinator разработан для функции length
. Я думаю, что моя путаница сводится к одному утверждению, которое контрастирует с двумя вариантами длины (до того, как комбинатор убирается):
A:
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0 )
(else (add1
((mk-length mk-length)
(cdr l))))))))
B:
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
((lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l)))))))
(mk-length mk-length))))
Page 170 (4-е изд.) утверждает, что A
возвращает функцию, когда мы применили ее к аргументу
тогда как B
не возвращает функцию
тем самым создавая бесконечный регресс самоприложений. Я в шоке от этого. Если B страдает от этой проблемы, я не вижу, как A избегает ее.