Пытаясь понять церковную кодировку в схеме
Я пытаюсь понять весь принцип церковного кодирования через Схему. Я думаю, что понимаю основы этого, такие как
Церковная цифра для 0
(определить c-0 (лямбда (f) (лямбда (x) x)))
Церковная цифра для 1
(определить c-1 (лямбда (f) (лямбда (x) (fx))))
... и продолжайте применять функцию к x N раз.
Теперь моя проблема в том, что все это значит? Если я возьму церковь-3, например:
(define c-3
(lambda (x)
(lambda (f)
(f (f (f x))))))
Что это на самом деле делает? У меня есть только базовые знания схемы, но я даже не понимаю, как использовать эту функцию? Что такое пример ввода с использованием функции c-3? это просто применить что-то 3 раза, как цикл?
1 ответ
Вы правы. с-3 в данном случае является функцией, которая принимает 1 аргумент. И возвращает другую функцию. Эта другая функция принимает функцию с 1 аргументом и применяет ее к первому аргументу.
В этом примере я вызываю c-3 с аргументом 3, это вернет функцию. Затем я передаю эту функцию, другую функцию, которая добавляет 1 к x.
((c-3 3) (lambda (x) (add1 x)))
6
Это будет производить 6
как вы видите. Применяется add1 до 3, 3 раза. Я знаю, что это сбивает с толку. Но вы можете вручную заменить аргументы в теле функции, чтобы лучше ее понять. Где бы вы ни увидели f, просто замените это на (lambda (x) (add1 x))
И заменить x
с 3
(или любое число).
Это будет работать с любой функцией с 1 аргументом, если аргумент имеет правильный тип.