#algorithm #lambda #functional-programming #scheme #lisp
#алгоритм #лямбда #функциональное программирование #схема #lisp
Вопрос:
Алонзо Черч использовал лямбда-исчисление для создания системы представления чисел с помощью процедур.
Например: 0 — это x
, 1 — это f x
, 2 — это f(f x)
и так далее, где цифра означает, сколько раз f
вызывается x
. Я написал программу в Scheme на основе предыдущих определений нуля и add-1 для итеративного вычисления цифры Черча числа. Код будет помещен в конце сообщения. Я пытаюсь запустить эту функцию для числа 7 и получаю неясную ошибку Error: <: number required, but got #("halt") [church-numeral, (anon), (anon), (anon), <]
. Единственное, что <
сравнивается, — это числа, и я нигде не могу найти в Интернете ничего о #("halt")
чем-либо, кроме сообщения об ошибке, являющейся лингвистически некорректной. Что означает эта ошибка и как я могу ее исправить?
Код:
(define zero (lambda (f) (lambda (x) x)))
(define (add-1 n)
(lambda (f) (lambda (x) (f ((n f) x)))))
(define one (lambda (f) (f (f x))))
(define (add m n)
(lambda (f) (lambda (x) ((m f) ((n f) x)))))
(define (church-numeral x)
(define (iter result x count)
(if (< count x)
(iter (add-1 result x ( 1 count)))
count))
(iter zero x 0))
(church-numeral 7)
Комментарии:
1. Похоже,
(iter (add-1 result x ( 1 count)))
так и должно быть(iter (add-1 result) x ( 1 count))
. Кроме того, вам не нужно переходитьx
кiter
.2. @DavidEisenstat это работает, не могли бы вы включить это в ответ, чтобы я мог его принять?
Ответ №1:
Похоже, что (iter (add-1 result x ( 1 count)))
должно быть (iter (add-1 result) x ( 1 count))
.