Как прочитать вложенную лямбда-функцию?

Чтобы показать вам, насколько "выразительным" является действительно лямбда-исчисление. Выражение ниже вычисляет 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))

0 ответов

Другие вопросы по тегам