Search This Blog

Sunday, November 05, 2006

An Introduction To Functional Programming Through Lambda Calculus

一共十章内容,第9章没看,因为第9章是ML,而第10章才是我感兴趣的common lisp。
这是我第一次接触λ calculus,我只能说,这本书写得非常好。作者展示了怎么样利用一个λ白手起家,先建立逻辑模型,再建立自然数模型,再利用这些东西,建立起其他的作为一门语言所需要的东西,类型,表,字符,字符串,复杂的数据结构等等,让我大开眼界。最精彩的我觉得是自然数的建立,因为之前几乎是空白,只有几个很基本的函数,identity,self_apply,select_first,select_second,由此构造出的and,or,not,true,false,然后,奇迹般地,就突然有了自然数,而且,每个自然数还竟然是一个函数。这是一个函数的世界,后来定义的加减乘除只是作用在函数上的函数,而乘方等运算又可以通过包装这些函数得到。这听起来很疯狂,但是仔细想想看,有什么不可以的呢?如果给我一个金属盒子,告诉我,插上电源,它可以运行一个叫linux的系统,那难道它不就是一台电脑吗?即使事实是盒子里躲了一只黑猩猩在狂按0和1以输出我所需要的东西,那又有什么重要的呢?只要对我来说它完成的是电脑的功能就可以了。再回到自然数,也一样,我何必在乎它是一个数字还是一个函数呢?只要我把1和2相加得到的是3,那就能满足我的需要了。
然后是lazy evaluation,这是我很早就听说过lisp采用的一种技术,书里讲得不多,只有一节,举了几个例子,所以理解并不是很深刻,我猜想,只有有了lazy evaluation,lisp才能成为可能,因为无论是normal order evaluation还是applicative order evaluation,都有其致命弱点,前者的重复计算太多,如果直接应用,估计速度会比蜗牛还慢,后者则很有可能导致计算无法终止,那对于实际应用来说会更致命,但是lazy evaluation很好的结合了两者的长处,只在需要时才计算一个λ expression,并且计算以后会代换每一个该表达式的occurence,所以也被称为call by need。
我只能用神奇来形容λ calculus。

1 comment:

fanmmm said...

神奇啊神奇,恭喜本宝