函数式编程初探

    最近工作较忙,一直没更新博客。不过工作之余,还是抽时间学习了一点新知识,也就是函数式编程方法。函数式编程(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,如需转载请自行联系原作者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值