函数式编程初探

简介:
    最近工作较忙,一直没更新博客。不过工作之余,还是抽时间学习了一点新知识,也就是函数式编程方法。函数式编程(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,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
程序员 Swift 开发者
26 函数式编程
函数式编程
36 0
|
5月前
|
JavaScript 前端开发 算法
函数式编程
函数式编程
14 0
|
并行计算 JavaScript 数据可视化
快速了解函数式编程
快速了解函数式编程
102 0
快速了解函数式编程
|
Scala 索引 Python
第5章 函数式编程
第5章 函数式编程
436 0
第5章 函数式编程
|
移动开发 JavaScript 前端开发
九、函数与函数式编程
纵观JavaScript中所有必须需要掌握的重点知识中,函数是我们在初学时最容易忽视的知识点。可能会有很多人、很多文章告诉你面向对象很重要,原型很重要,可是却很少有人告诉你,面向对象中所有的重点难点,几乎都与函数息息相关。 包括我之前几篇文章介绍的执行上下文,变量对象,闭包,this等,都是围绕函数的细节来展开。
110 0
|
存储 SQL 分布式计算
深入理解函数式编程
深入理解函数式编程
深入理解函数式编程
|
存储 Java 编译器
面向对象编程 V.S 函数式编程
面向对象编程 V.S 函数式编程
129 0
面向对象编程 V.S 函数式编程
2. 函数式编程
上篇说 ReactiveX.io (官网)给的定义是,Rx是一个使用可观察数据流进行异步编程的编程接口,ReactiveX结合了观察者模式、迭代器模式和函数式编程的精华! 什么是 函数式编程 Functional Programming 简单说 Fun...
945 0
我对函数式编程的理解
渐渐地我们所熟悉的语言基本都或多或少地支持了函数式编程的特性,也越来越多地在各种场合听到“函数式编程”。那么究竟什么是函数式编程呢?它会对我们带来什么影响?这些是我需要去探究的。看了一些书,查了一些资料,我觉得John Hughes的[Why Functional Programming Matters](https://www.cs.kent.ac.uk/people/staff/dat/mir
2170 0