从函数式的角度反思
我们都知道第一台电脑是ENIAC,但更前是什么?加法器,差分机,分析机等。还记得打孔卡吗?没错,最古脑的编程。为什么我提到这些?因为他们的变化,正是我们思维的应有的变化,但纵观各大技术论坛,哪怕是学校,公司,大部分都忽视了这个变化。
接着说,为什么加法器,分析机等,不叫做电脑?最重要的差别,存储。之所以叫“脑”也因为具有记忆能力。然而我不是来解释什么是电脑的,我提出的目的是让你看到,即使在第一台计算机诞生之前,仍然能够进行逻辑运算。人脑的记忆能力和逻辑能力是分开的,你即使记得 1 2 3 等数字,+-*/等符号,但这些记忆不是逻辑——你只是记住了,这并没有证明你了解他们的关系。计算机其实也是这样,运算器和存储器是很自然地分开的两个概念。
我们都是编程的,自然地我们经常接触存储技术,持久层等概念。嗯,我们认为掌握这些就能满足计算机的要求了。但事实是,这是非常表面,或者说这些根本没有解决问题。最近看过我帖子的人都应该知道,我编程思维已经发生很大改变。没错,我已经纵身投入到函数编程领域,特别是Haskell。我们都知道跟计算机是建立在大量的数学理论上,所以跟计算机交流最好就是数学。我们最常最广泛使用的指令式编程,却离数学非常远。
函数世界里的计算机
指令式与函数式对比,这是个久远的话题,好像函数式一直处于下风。我们经常说指令式对自然语言友好,函数苦涩难懂。但我并不谈那个,而是谈谈这个:在指令式和函数式的世界观中,他们认为计算机是什么?这是很少人会去思考的问题。在指令式的世界观中,很简单,计算机就是指令的集合,而函数式呢?非常特别,它认为计算机是一个IO函数(特别拿出Haskell,因为他是纯的)。我第一次接触Haskell的时候,看见main函数是IO函数时,也是一愣,然后脑中莫名冲动起来,因为函数式一直以来都是因为IO问题而遭人“歧视”。在这么纯的函数语言中,IO是如何处理呢?因为只有处理好了IO才能登上计算机的舞台。
我以前有提过这么一个观点:存储了的数据,若果“永远”不会被使用来输出,那就等于没有存储数据。也就是说我们之所以存储数据,是因为我们以后“一定”会输出它(不一定是直接输出)。函数式在这里也有相似的理解,用抽象的表达式表达就是IOin ==> function ==> IOout,也就是说计算机实际上就是IO,整台计算机的逻辑就是中间的function。多么美妙,输入与输出是一起的,函数是他们的桥梁,这与指令式的思维非常不同。在Haskell里我接触到了monad,这真是神奇的东西,因为是它实现了函数里的IO,函数里的IO不像指令中的,不是想在什么位置输出就在什么位置输出,它是集中输出的,你可以理解IO是一个值类型,这类值具有这样的特性IO+IO=IO,就像[]++[] =[]一样。它把输出理解成可运算的(组合),类似这样的效果:print "abc\n" + print "def" = print "abc\ndef" ,最后把合成的东西交给IO,就会输出你想要的结果。从现实世界走入计算机,经过计算机思考,再从计算机走出现实世界,这就是函数式思维。
上面就像我在介绍函数式一样,这是必须的,因为我们进行反思前,首先要了解函数的思维。接下来,首当其冲第一个要反思的是数据库,DB。(等等,回家后接着写)
[该贴被SpeedVan于2013-07-26 18:36修改过]
[该贴被SpeedVan于2013-07-26 19:15修改过]