Как прочитать вложенную лямбда-функцию?
Чтобы показать вам, насколько "выразительным" является действительно лямбда-исчисление. Выражение ниже вычисляет 10! (десять факторных) с использованием в основном элементов лямбда-исчисления, т.е.
- идентификаторы
- один аргумент лямбда
- вызовы функций
Если вы посмотрите внимательно, вы увидите, что это выражение имеет рекурсивные элементы, а это означает, что мы можем создавать рекурсивные функции, используя только лямбда-исчисление!
Этот код ниже использует то, что называется Y-комбинатор
(((lambda (x)
((lambda (f)
(lambda (n)
(if (equal? n 0) 1 (* n (f (- n 1))))))
(lambda (v) ((x x) v))))
(lambda (x) ((lambda (f)
(lambda (n)
(if (equal? n 0) 1 (* n (f (- n 1))))))
(lambda (v) ((x x) v)))))
11)
Это пример из нашей лекции. Мы не учим Y-комбинатор. Может быть, поэтому так сложно понять код выше.
Я пытался разбить код на кусочки, но все равно не понял.
;body1
((lambda (x)
((lambda (f)
(lambda (n)
(if (equal? n 0) 1 (* n (f (- n 1))))))
(lambda (v) ((x x) v))))
(lambda (x) ((lambda (f)
(lambda (n)
(if (equal? n 0) 1 (* n (f (- n 1))))))
(lambda (v) ((x x) v)))))
;value1
11
;body2
(lambda (x)
((lambda (f)
(lambda (n)
(if (equal? n 0) 1 (* n (f (- n 1))))))
(lambda (v) ((x x) v))))
;value2
(lambda (x) ((lambda (f)
(lambda (n)
(if (equal? n 0) 1 (* n (f (- n 1))))))
(lambda (v) ((x x) v))))
;body3
lambda (x)
;value3
((lambda (f)
(lambda (n)
(if (equal? n 0) 1 (* n (f (- n 1))))))
(lambda (v) ((x x) v)))
;value3-body
(lambda (f)
(lambda (n)
(if (equal? n 0) 1 (* n (f (- n 1))))))
;value3-value
(lambda (v) ((x x) v))