1.3 函数式编程
Clojure编程乐趣
快点回答,函数式编程是什么意思?错!
别太泄气,其实,我们也不知道确切的答案是什么。函数式编程只是诸多定义模糊的计算机术语1中的一个。如果找100个程序员问它的定义,我们会得到100个不同的答案。确实,某些答案是类似的,但如同雪花一般,没有两个答案是完全一样的。要进一步搅混水的话,让计算机科学的专家们单独给出定义,我们可能会发现,某些答案甚至是彼此矛盾的。同样,任何一个函数式编程定义的基本结构都可能会不同,这完全取决于回答问题的人喜欢用哪种语言写程序:Haskell、ML、Factor、Unlambda、Ruby、Qi等。随便一个人、一本书或是一门语言怎么就能声称自己是函数式编程的权威呢?然而,正如大多数各具特色的雪花都是由水组成的,各种说法的函数式编程核心都遵循着同样的核心原则。
1.3.1 一个可行的函数式编程定义
无论函数式编程定义用的是lambda演算、单子I/O(monadic I/O)、delegate还是java.lang. Runnable,基本的单元可能就是某种形式的过程、函数或是方法—这是根本。函数式编程关心和处理的是函数的应用和组合。再进一步,一门被认为是函数式的语言,它的函数概念一定是一等的。在这门语言里,函数可以存储、可以传递,还可以返回,同语言里的其他数据一样。各种不同的定义远远超出了这一核心概念,但是,谢天谢地,作为起点,这足够了。当然,我们还会进一步阐述一下Clojure风格的函数式编程,包括纯粹性、不变性、递归、惰性和引用透明等主题,不过,这些东西稍后会在第7章讨论。
1.3.2 函数式编程的内涵
一般说来,面向对象程序员和函数式程序员看到问题和解决问题的方式有所不同。面向对象思维模式采用的方式是,把应用领域定义成一组名词(类),函数式思维模式则会把解决方案视为各种动词及其组合(函数)。虽然二者产生的结果可能是一样的,但函数式解决方案会在简洁、可理解、可重用方面更胜一筹。确实如此!希望在本书结束时你也会认同,函数式编程会让程序设计更为优雅。这是一种思维模式的转换,从考虑名词,到思考动词,但这个旅程物有所值。无论如何,我们都相信,Clojure会让你获益良多,反哺到你选择的语言中—唯有打开心胸,方能体会这一点。
1快点回答,组合子(combinator)的定义是什么?云计算呢?企业级呢?SOA呢?Web 2.0呢?真实世界呢?黑客呢?通常,追求有唯一准确定义这件事无异于缘木求鱼。