Search code examples
schemeracketchurch-encoding

How to return the Church number


I want to change decimal encoding number to chruch encoding number ?

(define (encode n)
  (lambda(fn)(lambda(x) (funPower (fn n)x))))

What's wrong with my code? Thank you.


Solution

  • Data struct and hardware decided church number is so so slower than binary number.

    #lang racket
    ; church-number->n : procedure -> number
    (define (church-number->n cn)
      ((cn (λ (x) (+ 1 x))) 0))
    
    ; n->church-number : number -> procedure 
    (define (n->church-number n)
      (local [(define zero (λ (f) (λ (x) x)))
              (define add-1
                (lambda (n)
                  (lambda (f)
                    (lambda (x) (f ((n f) x))))))
              (define (aux n cn)
                (if (= 0 n)
                    cn
                    (aux (- n 1) (add-1 cn))))]
        (aux n zero)))
    
    
    ;;; TEST
    (church-number->n (n->church-number 101)) ; 101
    (church-number->n (n->church-number (church-number->n (n->church-number 666)))) ; 666
    
    ; still slow than binary number
    (church-number->n
     (compose (n->church-number 100) (n->church-number 5))) ; 500
    
    (define mult
      (lambda (m)
        (lambda (n)
          (lambda (f)
            (lambda (x)
              ((m (n f)) x))))))
    
    (church-number->n ((mult (n->church-number 100)) (n->church-number 5))) ; 500