博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数式编程初探
阅读量:5956 次
发布时间:2019-06-19

本文共 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,如需转载请自行联系原作者
你可能感兴趣的文章
Linux常用命令--iconv
查看>>
varnish的了解与常用配置使用
查看>>
Product user profile information 没有导入
查看>>
DELL T410服务器U盘安装Centos7
查看>>
解读最具O2O属性—哈根达斯微信企业号的成功之道
查看>>
Sqlserver2008日志压缩
查看>>
linux更改语言
查看>>
centos7 修改mac地址
查看>>
<script>标签的加载解析执行
查看>>
恢复rm删除的文件(ext3
查看>>
账户注销完自动登录账户,并且不需要再点击屏幕的账户头像
查看>>
【Interface&navigation】按钮(29)
查看>>
Extjs4.x (MVC)Controller中refs以及Ext.ComponentQuery解析
查看>>
Server-01 How to Find the Remote Desktop Port
查看>>
Java--接口、抽象与继承
查看>>
通过IP判断登录地址
查看>>
Oracle闪回技术
查看>>
利用单壁路由实现vlan间路由
查看>>
hello world
查看>>
CentOS 7 配置yum本地base源和阿里云epel源
查看>>