2009年4月16日星期四

关于函数编程的一些想法


这文章是从NTParty的Mailling-list里我写的回信里摘出来的~


更多的了解了FP后,我突然有种条条大路通罗马的感觉:
Design Pattern的最终目的其实就是去降低系统的耦合,那什么叫耦合,其实就是代码的副作用~所谓的高内聚、低耦合的理念就是设法消除代码执行的副作用,把副作用的影响范围变得可控~
这是由于传统语言,一开始就是靠副作用为基础的。特别是到了C语言这个时代,把传统的语句、命令、函数,全部统一为了Function,只是会出现void类型的返回值。

function always need to return "something", and “void” represents the function returns nothing!

It is somehow similar to the "dynamic" type in C# 4.0, which represents that something's static type is dynamic.

(实在不好意思,实在不知道这几句话,怎么用中文表达,中文表达不出这种巧妙的用词来,就像诗词不能翻译为英文一样)

所以说,当C语言一切都归结为函数的时候,函数具有副作用基本上是C这一系语言的最基本特性。
而从C衍生出来的C++、C#、Java等一系列语言都不可避免的遇到了如何控制副作用的问题~于是 GoF 把人的经验总结以后,称之为 Design Patterns。

简而言之就是传统的语言就是以丰富的副作用出发,逐步控制消减副作用,最终把副作用控制在某个可控的范围里面。

然而C语言所走的进化之路不是唯一的,就像几何第三公理不是唯一的一样(欧氏几何规定过直线外一点,有且只有一条直线与当前直线平行),虽然C语言衍生出了一个伟大的语言体系,但是他不是唯一的真理。
FP语言走了和他完全相反的一条路子(就像椭圆几何和双曲几何那样),FP语言一开始就规定函数,没有副作用,由输入完全决定输出,变成了一个纯粹的无记忆系统。因此FP语言不存在传统意义上的Desgin Patterns一说,因为它根本不需要控制耦合、隔离代码,FP的函数之间本来就是完完全全0耦合的(因此才可以颠倒顺序也能很好的运行)
然而FP语言遇到的问题也刚好和传统语言相反,在使用FP语言编程的时候就似乎详尽一切办法去让函数具有副作用,最后达到副作用控制在某个范围内的效果~其实和传统语言是殊途同归的。而函数编程里的这些让函数具有副作用的手段,我们也可以认为是FP特有的Design Patterns。事实上我认为FP语言的Continuation这样的方式就是一种Pattern。

PS:刚接触FP的时候我就觉得这东东,不是很陌生,我肯定什么时候在这样的公设下做过设计。最后终于让我想起来了~那就是著名的VHDL~或者是电路系统。
想想数电一开始的模型就是一个多输入单输出无记忆的模型,所有的门电路都是这样的。
直到人们想方设法用几个门电路实现了Flip-Flop(我忘了这东东的中文名字了),然后才让电路系统有了记忆能力,才有了记忆系统。
所以函数变成的思想其实和电路设计的思想是非常接近的。

PS2: 事情总是这样的诡异:人们用Lambda模型的电路系统设计了图灵模型的计算机系统,然后再在其上实现一个Lambda模型的语言。
就像一个人装了个Windows,然后跑个虚拟机,里面跑个Linux,然后再跑个虚拟机,里面装上Windows~GOD~为什么要那么别扭啊~

Posted via email from timnew's posterous

没有评论:

发表评论