ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
## 函数式编程 [函数式编程](http://en.wikipedia.org/wiki/Functional_programming) 是一种强调函数必须被当成第一等公民对待, 并且这些函数是“纯”的编程方式。这是受 [lambda表达式](http://en.wikipedia.org/wiki/Lambda_calculus) 启发的。纯函数的意思是同一个函数对于同样同样的参数,它的返回值始终是一样的 — 而不会因为前一次调用修改了某个全局变量而使得后面的调用和前面调用的结果不一样。这使得这种程序十分容易理解、调试、测试。它们没有副作用 — 修改某些全局变量, 进行一些IO操作(文件IO和数据库)。状态被维护在方法的参数上面, 而这些参数被存放在栈(stack)上面(通常通过递归调用), 而不是被维护在全局的堆(heap)上面。这使得方面可以被执行多次而不用担心它会更改什么全局的状态(这是非常重要的特征,等我们讨论事务的时候你就会意识到了)。这也使得高级编译器为了提高代码性能而对代码进行重排(reording)和并行化(parallelizing)成为可能。(并行化代码现在还很少见) 在实际生活中,我们的程序是需要一定的副作用的。Haskel的主力开发Simon Peyton-Jones曾经曰过: “到最后,任何程序都需要修改状态,一个没有副作用的程序对我们来说只是一个黑盒, 你唯一可以感觉到的是:这个黑盒在变热。。”( [http://oscon.blip.tv/file/324976](http://oscon.blip.tv/file/324976) ) 问题的关键是我们要控制副作用的范围, 清晰地定位它们,避免这种副作用在代码里面到处都是。 把函数当作“第一公民”的语言可以把函数赋值给一个变量,作为参数来调用别的函数, 同时一个函数也可以返回一个函数。可以把函数作为返回值的能力使得我们选择之后程序的行为。接受函数作为参数的函数我们称为“高阶函数”。从某个方面来说,高阶函数的行为是由传进来的函数来配置的,这个函数可以被执行任意次,也可以从不执行。 函数式语言里面的数据是不可修改的。这使得多个线程可以在不用锁的情况下并发地访问这个数据。因为数据不会改变,所以根本不需要上锁。随着多核处理器的越发流行,函数式语言对并发语言的简化可能是它最大的优点。如果所有这些听起来对你来说很有吸引力而且你准备来学学函数式语言,那么你要有点心理准备。许多人觉得函数式语言并不比面向对象的语言难,它们只是风格不同罢了。而花些时间学了函数式语言之后可以得到上面说到的那些好处,我想还是值得的。比较流行的函数式语言有: [Clojure](http://clojure.org/) , [Common Lisp](http://en.wikipedia.org/wiki/Common_Lisp) , [Erlang](http://erlang.org/) , [F#](http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/default.aspx) , [Haskell](http://www.haskell.org/) , [ML](http://en.wikipedia.org/wiki/ML_(programming_language)) , [OCaml](http://caml.inria.fr/ocaml/index.en.html) , [Scheme](http://en.wikipedia.org/wiki/Scheme_(programming_language)) , [Scala](http://www.scala-lang.org/) . Clojure和Scala是Java Virtual Machine (JVM)上的语言. 还有一些其它基于JVM的语言: [Armed Bear Common Lisp (ABCL)](http://common-lisp.net/project/armedbear/) , [OCaml-Java](http://ocamljava.x9c.fr/) and [Kawa (Scheme).](http://www.gnu.org/software/kawa/)