本文共 1493 字,大约阅读时间需要 4 分钟。
最近工作较忙,一直没更新博客。不过工作之余,还是抽时间学习了一点新知识,也就是函数式编程方法。函数式编程(FP
)并不是什么很新的东西,很久以前,甚至比C
语言还早,就已经出现了。最为典型的就是Lisp
了。
本来函数式编程并没有像JAVA
那样成为程序员中的明星,受到的关注也很少。但是随着一些趋势的发展,人们又再次将目光放在它上面。现在这是一个多核并行的时代,传统的命令式编程存在很多难以克服的问题,最主要的一个就是状态的可变性,或者说副作用。在函数式编程中,你可以声明一个状态,但是不能改变这个状态。而且由于你无法改变它,所以在函数式编程中不需要变量。这种特性使得函数式编程特别适合于多核计算服务,因为状态是不可变的,所以我们再也不用提心吊胆担心数据不一致和状态混乱的问题了。 学习FP
最主要的是了解其思想,至于具体的语言上,并没有必要过分的深究。当然如果大家很有兴趣,也可以探究探究。目前在业界存在很多种函数式编程语言,个人选择了Haskell
作为入门。一方面haskell
是真正的纯函数式语言,另一方面,haskell
拥有一个良好的开发环境,很容易进行开发测试。当然,haskell
文档较少,主要文档基本上都是英文,这也是一个问题。 关于开发环境的搭建,非常容易,大家去google
搜索一下“Haskell Platform
”即可,然后按照自己的系统选择相应版本下载。一般都是Haskell Platform For Windows
。 下载后得到一个EXE
,然后安装即可。不得不说,这个还是非常不错的,没有任何复杂的配置,也不需要改动什么配置文件。 安装好后从开始菜单进入WinGHCi
即可进入Haskell
交互式开发环境。 在函数式编程中,递归被大量使用。相信很多人和我一样,以前并不喜欢递归,代码中能避免就避免。一方面递归不容易理解,另一方面递归对机器的消耗比较严重,一不小心就会造成堆栈溢出。但是在FP
中,不得不直面递归,其实递归用多了自然也习惯了,关键是思维要转变过来。 fib 1 = 1
fib 2 = 1
fib n = fib(n-2)+fib(n-1)
非常简洁明了,而且最令人印象深刻的是,函数式编程只要把问题描述清楚了,问题也就解决了。写这种代码有种写数学公式的感觉,非常神奇。 可能这个还是比较容易理解的,下面再来一个乘法的递归实现: mult a 0 s = s
mult a b s = mult a (b-1) s+a
这段代码用的是尾递归,比如计算123*321
,调用mult 123 321 0
即可。关于尾递归的概念各位若有不清楚可以自行去网上查阅。尾递归是一种很安全高效的递归,和传统递归不同,尾递归只要优化得当,不会出现堆栈溢出的问题。而且代码看起来也非常优美,给人一种美感。 fac 1 s = s
fac n s = fac (n-1) (n*s)
对于Haskell
的学习,我参看的是久负盛名的Yet Another Haskell Tutorial
。这本小书只有190
多页,但是基本上把Haskell
重要的地方都讲到了。如果只想了解函数式编程思想,阅读前5
章就足够了。另外函数式编程的一个核心理论就是“λ演算”,如果没有学习这个理论作为基础,则很多东西难以理解。 本文转自 kevx 51CTO博客,原文链接:http://blog.51cto.com/spinlock/517278,如需转载请自行联系原作者