《中国哲学简史》

记得不太大的时候就听说冯友兰是中国近代最大的哲学家,那时候对哲学连起码的感性认识都还没有。要说对哲学渐渐有印象,最初还是大学时候读罗素的《西方哲学史》,当时还细细做了笔记。此后是庞思奋的《哲学之树》等,基本都是综述类的书。以前以为中国并不存在西方意义上的哲学,直到后来看了《明朝那些事儿》和《阳明学的形成与发展》才知道,原来中国的哲学之树也是这样枝繁叶茂,硕果累累。那段时间,每次想到王守仁的话都觉得热血沸腾,也的确知行合一实践了一段时间,只可惜好景不长啊。

“依此良知,忍耐做去,不管人非笑,不管人毁谤,不管人荣辱,任他功夫有进有退,我只是这致良知的主宰不息,久久自然有得力处,一切外事亦自不能动。”

《中国哲学简史》这书是冯友兰先生的学生由英文翻译过来的,但是读起来非常顺畅。该书从先秦哲学一直讲到近代西方哲学侵入,书本身不是简单的人名书名陈列,而是仿佛一座宏大的教堂,将中国哲学的全貌画于其中,让每个人都对整体脉络有了清晰的认知。可能由于这本书最初是为老外写的吧,内容非常容易理解,按照哲学的发展过程,一步一步娓娓道来,评论鞭辟入里。最初还想记些笔记,后来发现,如果记,那需要记得的东西就太多了。有时间重读吧。

书中有一些内容印象非常深刻,也是这几年读历史的时候有感觉,但是没法表达的一些东西。比如书中解释为什么中国没有宗教,而只有哲学,冯友兰先生的解释是,哲学是高于宗教的一种表现形式,宗教是哲学加上迷信和仪式等,人可以没有宗教,但不能没有哲学。这其实解释了为什么人们批评中国人没有信仰,但我们并没有活得野蛮。

纵观本书,可以感受到,中国的哲学对整个社会文化的影响不出意外的主要集中在儒家和道家上。儒家讲究入世的哲学,道家讲究出世的哲学,道家的宗教分支影响很小,佛教的影响其实也不算大,但佛学影响很大。佛学和道家的结合,产生了禅宗,也实际就是现在我们每个人所感受到的佛教意味,也是影视作品、武侠小说中最常出现的佛家的样子。尤其禅宗讲究“顿悟”,让人想起《昆仑》中那个痴傻的花生。

读禅宗那一部分的时候,印象很深刻,这一年来,自己的心态和佛家所追求的心态很相似,心无挂碍,对任何事情都“无滞着”。很多时候,即便遇到事情,需要讲些什么的时候,也不会开口,开口与否有什么关系呢,这倒很像禅宗的第一义“静默”,什么也不言语。这其中有很多哲学意味的道理,但我很难理解这个哲学的意义在哪里。禅宗和道家都提倡“无为”,这里不是讲汉初“无为而治”那种政治上的理念,而仅仅就哲学层面讲,“无为”就是“无心”,做事不求任何结果,既不求好的结果也要避免坏的结果,“毋宁说它的目的,在于做事而不引起任何结果”。认为“以无心做事,就是自然的做事,自然的生活”,这在现代生活中根本不具备可操作性,即便有操作性,这玩意有什么用呢。读完这书我对佛学就更加困惑了:既然有知识的高僧都明白佛祖只是肉身凡人,佛是精神上的而非宗教上的,那么修行成佛是为了什么?冯友兰先生说,儒家修身是为了成为圣人,或者最高境界“内圣外王”,可以做政治家,施展政治抱负,但是佛家呢,修行的目的竟然是涅磐!“涅磐”是什么,它是说,人有欲念,就会有痛苦,就逃离不了生死轮回,万劫不覆,涅磐,就是超越生死轮回。修行的目的难道就是看破一切、麻木不仁?我是实在无法理解,若能相通这一点,我估计也可以顿悟成佛了。

新道家和新儒家都是很有趣的主题,涉及到很多大人物,尤其加上清代的古文学派和今文学派之争,让这段发展历程一下子生动起来。冯友兰先生对理学和心学的分析也很值得品味。在读程朱理学部分的时候,正巧也在读一些Haskell相关的论文,又回想起《西方哲学史》中描述的那些奇怪的宇宙发生论,突然意识到,其实这些东西并非因为缺乏精确的科学依据而毫无用处。这些假想其实是一个模型,我们可以在这个模型上验证我们所理解的现象。若是这些现象在这个模型上可以得到解释,并能自圆其说,那就说明这个模型是合理的,并且在此基础上还可以推演出一些未知的东西,这就是理学,也是目前很多研究领域所采用的方法。中国人认为宇宙由阴阳组成,并用阴阳来解释所有现象,我们解释得通,也就说明宇宙从某种程度上来说,的确是有阴阳构成。即便将来某种科学理论可以完美的解释宇宙,我们也可以断定,那些公式的推演过程中,必定有会在某些条件下会以阴阳作为表象为我们所辨识。

名家和法家篇幅也比较多。名家更接近西方的逻辑主义,即冯友兰先生所谓“正的方法”,逻辑学很有趣,跟编程语言也关系紧密,但名家本身不是太有趣。法家更像是那个社会背景下的独特产物,但他们的思想我很赞同,韩非认为“势”,“法”,“术”是治国三个不可缺少的要素。这三个词很像雕爷提起的曾鸣教授的经商之道“取势、明道、优术”。法家的治国之术非常简单明了,领导只要懂得赏罚就可以了,他只要将特定的职务授予一定的人,然后观察事情做得如何就可以了。他不需要也不应该操心下属用什么方法完成,只要他能完成就行。完成的好,就奖赏,完成的不好,就惩罚。多么简单易学的道理,所以在一个官僚机构,越大的领导越好当。换句话说,懂了这个道理,什么人都可以当大领导,这也是为什么这个构建于裙带关系之上的社会,还可以照常运转。

这几个月读书效率比较低,很多书看不进去,心情也很糟糕,最近又翻出三岛由纪夫的书来读,希望能找到一些安慰。在重读《假面的告白》,打算读完后重读《挪威的森林》,然后重读保罗·奥斯特的《孤独及其所创造的》。三岛由纪夫、村上春树、保罗·奥斯特,这三位是这些年来最喜爱的小说家了,每当心情差的时候,只有他们的书能看得进去。这三位好像一点交集也没有。

Haskell中概念的理解(一)

刚才看了Bryan O’Sullivan的一个演讲《Running a startup on Haskell》,讲公司招人以及使用Haskell的一些现状。很赞同Brayan说的一句话“if cerntain skills are really widely distributed in a population they become completely meaningless”,如果某个技术非常流行,说懂这个东西毫无意义,如果一个人在简历里写他懂PHP懂Java,就像是在告诉别人他长了个脑袋。

断断续续学习Haskell也好几年了,没事的时候就会拿它作为一种思维训练,试图准确理解其中的概念,但是智力实在不够,每次多理解一些而已。最近好像突然领悟了很多(不敢说“想通”),不知是不是量变到质变的一个过程。

最近连续读了很多材料,有些是以前读过但未理解的。回想这个过程,应该是从理解Polymorphic Typechecking开始,读的是Basic Polymorphic Typechecking,主要收获是了解了大致的算法,对datatype(type constructor)有个更具体的感知。学习Haskell,理解类型多态很重要,只有理解了它才能理解typeclass和高阶多态,其实类型多态很像C++的模板,只是用在type constructor的定义中让人感到理解困难而已,尤其是type constructor中包含函数时,考虑下datatype中类型变量的顺序问题会有助于理解这个问题。然后重读了《Learn You a Haskell for Great Good!》第八节“Making Our Own Types and Typeclasses”,这一节算起来读过不止一次,但仅这次完全读懂,对类型理解也更加深刻,尤其是我感到自己可以很容易的理解StateMonad那诡异的s->(a,s)了,于是开始读一些Monad的tutorial

这几年学Haskell,大部分时间都花在Monad上,很早就会用,但是理解不到这个东西的好处,以及Monad到底如何“隔离副作用”,更别提自己在何时、如何设计一个Monad了。最近这块感悟比较多,有几个重要材料值得参考。Haskell两本免费教材《Learn You a Haskell for Great Good!》和《Real World Haskell》中Monad相关章节很重要。《All About Monads》对每个常用的Monad都有讲解,文中第一段直指Monad核心,理解这句话就理解了Monad,但是理解这句话是结果,试图理解这句话本身并没有太大意义;文中提到Monad的三个重要属性Modularity、Flexibility、Isolation ,其实这三个属性说的是一回事,理解这点很重要,同样理解这点是结果,另外要理解One-Way-Monad以及为什么Maybe不是One-Way-Monad,这是隔离副作用的关键。然后是Brian Beckman的视频“Don’t fear the Monad”,这个视频我很早以前看的时候还以为他讲跑题了,这次看完才恍然大悟,Brian的Bind类型推导过程也很精彩,看的时候回想一下《All About Monads》的第一段。正如Brian也提到的,其实Monad的所有魔力都在于那个bind(>>=)函数,每个Monad有自己个性化的bind。对于One-Way-Monad,这个函数使得我们可以操作m a中的a,而不会将a泄露出去,这是Monad的隔离性。一组相同的Monad(如IO)可以放到一个do-notation里执行,也就是combining computations,这种组合方式其实是一种模块化,它将一类操作关联到一处,而不影响其他部分,举例说,如果出现大量的嵌套case+Maybe语句,就可以将这些Maybe放到一个do-notation里,精简代码而又永远不会出错,因为与Maybe有关的计算都在bind里定义了。这样一个do-notation其实代表了某一类型Monad的一个计算序列(bind),而其计算的内容在其内部(类型m a的a)无法被外界直接取得,除非通过bind,也就是《All About Monads》的第一句话,“A monad is a way to structure computations in terms of values and sequences of computations using those values. ”

理解Monad之后才发现,其实这个概念并不难,理解它也并不一定需要范畴论的知识。让我吃惊的是发现在haskell中,这东西并不是什么重要的组成部分,举个不恰当的例子,就好像微积分在量子物理学中的作用一样,这是个必备技能,但根本没有触到关键。学习Haskell的难点还在于类型上,从类型的角度思考问题,通过类型来做问题抽象,才是困难之处。

下面说说typeclass,这是haskell中的一个核心概念,从SPJ的一个分享来看,这个东西最初只是一个实验功能。可以从Mark P. Jones的paper《Functional Programming with Overloading and Higher-Order Polymorphism》中找到这个概念诞生的原因。typeclass是为了解决任意多态类型所存在问题的一个折中方案。考虑函数size(例子瞎举的),它返回“某个数据结构的的大小”,如果希望它是多态的,而不是每次都要定义某个类型自己的sizeA::A->Int,sizeB::B->Int的话,就需要定义size::a->Int,但是如果不对a的类型加以限制,就可以将没有size的类型应用于这个函数,导致运行时错误,这是haskell这类静态类型语言所无法容忍的。于是typeclass出场了,通过定义一个typeclass叫做Countable,并将size定义为size::Countable a => a -> Int,对于每个应用于size的类型,都要求其为Countable的instance,否则类型检查失败,这样就非常优雅的解决了这个问题。可以看出typeclass更加接近interface。总之,它最初的出现是为了让haskell更精确的做类型推导,不会出现运行时错误,同事保持多态的优美。我前面说它是个折中方案是因为,(我认为)它其实是一种人工向编译器提供类型信息的方法,同时增加了不小的编码成本。

Mark P. Jones的paper非常优秀,其中不仅讲解了typeclass,还介绍了kind system,这是理解haskell类型系统的一个重要部分。有时间要细读读Mark以及Simon Peter Jones, Simon Marlow, John Hughes, Philip Wadler这群神人的paper,正是由于Haskell背后有这群人,这门语言才会这样魅力四射、引人入胜。

Haskell中还有很多其他内容没有花时间去学习理解,比如并发和Arrow,估计近期也没太多时间了。