Пытаясь понять церковную кодировку в схеме

Я пытаюсь понять весь принцип церковного кодирования через Схему. Я думаю, что понимаю основы этого, такие как

  • Церковная цифра для 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 аргументом, если аргумент имеет правильный тип.

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