大话functional编程语言
今天计算机已经被广泛应用于处理繁杂的商业事务和海量的用户数据。人们也许遗忘了,它最初是被用来帮助进行数值计算,简单说,用来求解数学问题的。
所以说functional编程语言,把计算机编程和数学紧密联系起来,回归到了计算机的本意。
有趣的是,数值计算并不是functional语言的强项。functional编程的主旨是通过数学的逻辑和代数的演算,帮助程序员解析复杂的编程问题。所谓解析,就是把复杂的问题拆解成简单的问题,一一解决,然后再组合拼装起来。
一般常用的编程语言(imperative)往往通过函数调用或者object-oriented方法把复杂问题进行拆分,但是组装起来就不是很容易了。
举例来说:假设“月光宝盒”是个API object。
-
调用一次:月光宝盒.波罗波罗蜜(至尊宝) = 回到五百年前,遇到紫霞仙子;到了黑风岭,把唐僧送给牛魔王;自己被十三娘所杀
-
再调用一次:月光宝盒.波罗波罗蜜(至尊宝(转世后))= 回到五百年后,带着唐僧去取经
为什么两次调用同一个函数,得到的结果不一样呢?就是这样的复杂性,使得代码无法被简单的组合起来,和重复使用。
你也许会说,我们刚才忽略了“波罗波罗蜜”的一个隐形参数:时光穿梭的年份。例如:
月光宝盒.波罗波罗蜜(至尊宝,−500)表示回到五百年前。
那么按照数学表达式的基本演算规则:
月光宝盒.波罗波罗蜜(月光宝盒.波罗波罗蜜(至尊宝,−500),+500) == 现在的至尊宝
也就是说,先回到五百年前,再从五百年前回来,应该等于没有发生过时光穿梭。因为:−500 + 500 = 0 (回到现在)
可是电影里的山贼至尊宝时光穿梭来回之后,变成了齐天大圣孙悟空。难道这是上天(不,导演)的安排?
问题出在“月光宝盒.波罗波罗蜜(至尊宝)”的调用过程中产生了side-effects,用通俗的话说,就是历史被改变了。
现在我们再来看看,functional编程语言能否帮我们把这个故事解析清楚呢? 其实也很简单,在functional语言中,我们换个角度,把“波罗波罗蜜”作为一个主线的函数:
- (至尊宝B,月光宝盒B,世界B) = 波罗波罗蜜(至尊宝A,月光宝盒A,世界A)
- (至尊宝C,月光宝盒C,世界C) = 波罗波罗蜜(至尊宝B,月光宝盒B,世界B)
每次调用“波罗波罗蜜”,都返回一个“新”的至尊宝、月光宝盒、和世界。 至尊宝A是山贼,至尊宝C是齐天大圣。有了这些表达式,我们还能分清
- 至尊宝B = 求紫霞仙子要月光宝盒,然后要和白晶晶成亲,却念念不忘紫霞
在世界A里有二当家的、白晶晶,十三娘。世界B里有紫霞仙子、唐僧、八戒、黑山老妖,牛魔王。世界C里有唐僧,二当家,白晶晶,十三娘,菩提老祖。世界A里的二当家,或者白晶晶和世界C里的二当家,或者白晶晶完全没有关系。
"波罗波罗蜜"这样的调用方法看起来繁冗,但是它保证每次调用,只要输入的参数一样,得出的结果一定是一样的。所有被side-effects影响的全都列出来,作为返回变量。这样functional语言的表达式,就和数学表达式一样了。很多强大的数学推理的方法也可以被应用到编程当中来。
此外, “转世轮回”也是故事中被广泛使用的函数,比如:
- 转世轮回(至尊宝B) = 齐天大圣
- 转世轮回(至尊宝C’) = 至尊宝A
至尊宝C’是被观音大师收走的前齐天大圣,和后来陪唐僧去取经的至尊宝C,判若两人。
其实大话西游的故事用一句代码来表述:
- (波罗波罗蜜)2 ⋅ 转世轮回(至尊宝C’) = 至尊宝C
解析完毕,收工#