Как я могу сделать церковные цифры более удобочитаемыми на шрифте? - PullRequest
2 голосов
/ 20 апреля 2010

Я могу довольно просто определить церковные цифры, используя схему:

> (define f (lambda (x) x))
> (f f) ;0
#<procedure:f>
> (f (f f)) ;1
#<procedure:f>

Однако из-за этого не очень легко распознать, что (f f) равно 0 и (f (f f)) равно 1. Есть ли способ сделать эти цифры более читабельными? Что было бы идеально, так это:

> (f f)
0
> (f (f f))
1

Пример приведен в схеме, но я отвечу на любом языке.

1 Ответ

9 голосов
/ 20 апреля 2010

Сначала давайте определим реальные церковные цифры, которые имеют желаемое свойство, которое 0 != 1:

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

Итак, zero - это церковное представление 0, (succ zero) из 1, (succ (succ zero)) из 2 и т. Д.

Теперь, поскольку это всего лишь функции, нет способа заставить repl отображать их в виде чисел, но вы можете определить функцию cn-to-int, которая преобразует церковные цифры в целые, которые затем могут отображаться нормально: 1010 *

> (define (cn-to-int cn) (cn (lambda (x) (+ x 1)) 0))
> (cn-to-int zero)
0
> (cn-to-int (succ zero))
1
> (cn-to-int (succ (succ zero)))
2
...