最近对FP(Functional Programming)很感兴趣,这两天在看SICP,见到一个很有意思的练习题2.6,是关于Church计数的。用函数来表示数字,对我来说太抽象了。查找了一些资料,稍稍理解了一些。

0λf.λx. x (define zero (lambda (f) (lambda (x) x)))
1λf.λx. f x (define one (lambda (f) (lambda (x) (f x))))
2λf.λx. f (f x) (define two (lambda (f) (lambda (x) ( f (f x)))))
3λf.λx. f (f (f x)) (define three (lambda (f) (lambda (x) (f (f (f x))))))
... ...
nλf.λx. fn x ...
  • 加法函数 plus(m,n) = m + n 利用了恒等式 f(m + n)(x) = fm(fn(x))

plusλm.λn.λf.λx. m f (n f x) =>

(define add
           (lambda (m)
             (lambda (n)
               (lambda (f)
                 (lambda (x) ((m f) ((n f) x)))))))

  • 後继函数 succ(n) = n + 1 (plus 1)。
succλn.λf.λx. f (n f x) =>
(define (succ n)
  (lambda (f) (lambda (x) (f ((n f) x)))))

  • 乘法函数 times(m,n) = m * n 利用了恒等式 f(m * n) = (fm)n
multλm.λn.λf. n (m f) =>
(define mult
  (lambda (m)
    (lambda (n)
      (lambda (f) (m (n f)))))) 

在参考[3]中,有另外一种写法,和上面的所谓“经典”写法略有不同, 例如:

(define two (lambda (f) (lambda (x) (f (f x)))))
(define two (lambda (f x) (f (f x))))

这两种写法等价么?首先我们知道two是f的2次复合函数。假定f(x) = x2,即

(define (f x) (* x x))。

第一种写法中,two是一个函数,它以另一个函数f为参数,而f的参数为x,(two f)可以运算得到f的2次复合函数, ((two f) 2) => f(f(2)) => 16。在第二种写法中,two的参数为,函数f以及函数f的参数x,(two f 2) => f(f(2)) => 16,而(two f)是无效的。意义上稍有不同。

参考:

1. Wikipedia [zh]
2. http://www.mactech.com/articles...
3. http://www.cs.cmu.edu/afs/cs/project...
评论:

早段时间你买了macOS是吧。MacOS真的那么好用么?一阵Ruby风连MacOS都给吹起来了?

发表于 hogt 在 2007年06月10日, 01:42 下午 CST #

Hogt, 我买MacBook Pro和Ruby没什么关系,呵呵。早就对MacOS和苹果的工业设计倾慕已久了,而Mac的价格也逐渐平民化,且Intel的CPU对安装多操作系统也非常方便(我现在的本子上有MacOS X,Ubuntu 7.04和Windows XP三个系统)。所以这次有机会更新自家用笔记本时,争得了老婆的批准,就买了台MacBook Pro。用了一段时间的MacOS,感觉还是不错的。其实现在Linux 3D桌面和Gnome的显示效果,已经和MacOS有一拼了。只是应用和驱动的支持还是不够。

发表于 Yong Sun 在 2007年06月10日, 03:02 下午 CST #

发表一条评论:
该日志评论功能被禁用了。

This blog copyright 2009 by yongsun