Shell's Home

Nov 10, 2008 - 1 minute read - Comments

SCIP,lambda,Church

贝壳最近在看SCIP,感觉受益匪浅。其中有一个2.6,使用函数表达数字,很难理解。贝壳查了查资料,这篇(http://blogs.sun.com/yongsun/entry/lambda%E6%BC%94%E7%AE%97%E4%B8%8Echurch%E8%AE%A1%E6%95%B0 )写的很好,贝壳就不多说了。贝壳把自己写的内容贴上来,作为一个借鉴。

(define zero (lambda (f) (lambda (x) x)))
(define one (lambda (f) (lambda (x) (f x))))
(define two (lambda (f) (lambda (x) (f (f x)))))
(define three (lambda (f) (lambda (x) (f (f (f x))))))
(define (add-1 n)
  (lambda (f) (lambda (x) (f ((n f) x)))))
(define (add m n)
  (lambda (f)
    (lambda (x) ((m f) ((n f) x)))))
(define (mult m n)
  (lambda (f) (m (n f))))
(define (show-func-number n)
  (define (inc x)
    (+ x 1))
  ((n inc) 0))

(display (show-func-number zero))
(newline)
(display (show-func-number one))
(newline)
(display (show-func-number (add-1 one)))
(newline)
(display (show-func-number (add one two)))
(newline)
(display (show-func-number (mult two three)))
(newline) 

结果:

0
1
2
3
6

show-func-number这个函数是将高阶抽象函数序列映射到一个具体的数上的。工作方法是,建立一个函数x=x+1,然后使用给定的高阶函数来映射这个函数。n次高阶函数会映射这个函数n次,于是结果函数就是x=x+n。然后将这个函数作用于0,不难得到结果吧?