Определение функции для представления целых чисел числами Черча (DrRacket)

Я пытаюсь определить процедуру, которая принимает целое число и возвращает его представление в цифрах Черча. Может ли кто-нибудь помочь мне понять ошибку, которую я делаю? Следующий код - это то, что я смог сделать до сих пор.

(define succ
  (lambda (cn)
    (lambda (f)
      (lambda (x)
        (f ((cn f) x))))))

(define (n->cn n)
  (if (= n 0)
      zero
      (succ (n->cn (lambda (x) (- x 1))))))

Когда я запускаю тест:

(test (num->cn 3) three)

Я получаю следующую ошибку:

exception (num->cn 3) at line 107
  expected: <no-expected-value>
=: contract violation
  expected: number?
  given: #<procedure:...ad/racket-file.rkt:99:21>
  argument position: 1st
  other arguments...:
   0

Кажется, он ожидает число? но процедура дана. Что, по моему мнению, соответствует назначению процедуры? Спасибо за помощь и комментарии для новичка.


person stcol    schedule 25.02.2021    source источник


Ответы (1)


Аргумент n->ch должен быть числом, а не процедурой:

(define (n->cn n)
  (if (= n 0)
      zero
      (succ (n->cn (- n 1))))) 
person Sylwester    schedule 26.02.2021
comment
Большое спасибо, Сильвестр. Это была именно ошибка. - person stcol; 26.02.2021