什么是函数编程
2014-03-04 18:03
197 查看
第一章 绪论
这一章主要回答有关 F# 和函数编程的一些问题。
什么是函数编程?
函数编程(FP,Functional programming)是三大编程范式中最古老的。第一个函数编程语言 IPL,是1955年发明,大约比Fortran 早一年;第二个是 LISP,1958 年发明的,比Cobol 早一年。
Fortran 和 Cobol 是命令语言,也叫过程语言。他们在科学计算、事务处理上的立刻成功,使命令语言的优势地位超过 30 年。1970 年代,出现了面向对象(OO,object-oriented)范式,随着面向对象语言的成熟,使得面对对象编程成为今天最流行的范式。
尽管强大的函数编程语言进行了连续开发,比如SML、Objective Caml(OCaml)、APL、Clean等,尤其是类函数编语言(Erlang、Lisp 和 Haskell)已有成功的应用。但是,自1950 年代以来,函数编程一直维持在学术研究阶段,直到最近。命令语言早期的商业成功奠定了它几十年的统治地位。直到企业需要解决复杂计算时,面向对象语言才逐步得到广泛接受。如今,大家终于认识到,函数编程不仅可以解决简单问题,更能解决复杂问题。
纯函数编程把所有程序视为函数的集合,函数接收参数,返回值。它不像命令语言、面向对象编程那样,无副作用,用递归代替循环迭代。函数式程序中的函数与数学上的函数非常类似,因为它们不能改变程序的状态。简单说来,标识符一旦赋值,就不再改变,函数不改变参数值,返回的结果是一个全新的值。其典型的底层实现是这样的:值一旦分配了内存中的一片区域,就不再改变,要计算结果,函数会复制一份,放在另一片区域,然后对复制区域中的值进行操作,而原来的值不受影响,还可以给其他函数使用。直到最终不需要时,值才会被舍弃(这就是垃圾回收机制的雏形)。
纯函数编程的数学基础非常优雅,因此,解决问题,也很优美、简洁。但是,无状态、递归使它在处理许多常见任务时不如其他编程范式方便。F# 最大的优势在于,可以混合使用多种范式,以你自己能用的最方便的方式来解决问题。
这一章主要回答有关 F# 和函数编程的一些问题。
什么是函数编程?
函数编程(FP,Functional programming)是三大编程范式中最古老的。第一个函数编程语言 IPL,是1955年发明,大约比Fortran 早一年;第二个是 LISP,1958 年发明的,比Cobol 早一年。
Fortran 和 Cobol 是命令语言,也叫过程语言。他们在科学计算、事务处理上的立刻成功,使命令语言的优势地位超过 30 年。1970 年代,出现了面向对象(OO,object-oriented)范式,随着面向对象语言的成熟,使得面对对象编程成为今天最流行的范式。
尽管强大的函数编程语言进行了连续开发,比如SML、Objective Caml(OCaml)、APL、Clean等,尤其是类函数编语言(Erlang、Lisp 和 Haskell)已有成功的应用。但是,自1950 年代以来,函数编程一直维持在学术研究阶段,直到最近。命令语言早期的商业成功奠定了它几十年的统治地位。直到企业需要解决复杂计算时,面向对象语言才逐步得到广泛接受。如今,大家终于认识到,函数编程不仅可以解决简单问题,更能解决复杂问题。
纯函数编程把所有程序视为函数的集合,函数接收参数,返回值。它不像命令语言、面向对象编程那样,无副作用,用递归代替循环迭代。函数式程序中的函数与数学上的函数非常类似,因为它们不能改变程序的状态。简单说来,标识符一旦赋值,就不再改变,函数不改变参数值,返回的结果是一个全新的值。其典型的底层实现是这样的:值一旦分配了内存中的一片区域,就不再改变,要计算结果,函数会复制一份,放在另一片区域,然后对复制区域中的值进行操作,而原来的值不受影响,还可以给其他函数使用。直到最终不需要时,值才会被舍弃(这就是垃圾回收机制的雏形)。
纯函数编程的数学基础非常优雅,因此,解决问题,也很优美、简洁。但是,无状态、递归使它在处理许多常见任务时不如其他编程范式方便。F# 最大的优势在于,可以混合使用多种范式,以你自己能用的最方便的方式来解决问题。
相关文章推荐
- JAVA 中的 List,Set,Map
- C#汉字转化为拼音
- C语言经典算法汇总
- zend 学习笔记二
- Zygote进程启动过程源代码分析
- 使用托管C++粘合C#和C++代码(二)
- 使用托管C++粘合C#和C++代码(一)
- jdk环境变量配置
- PureFTPd+Mysql+PHP_Manager实现虚拟用户磁盘限额
- Qt4升级到Qt5所遇到的问题的解决方法(qt4转qt5的问题及解决方法)
- java EE 应用(1)
- 循环双链表基本操作C++实现
- Java的集合与框架
- java中的线程
- C#内存分配图
- C# 获取 mp3文件信息
- ruby代码重构第二课
- open cv+C++错误及经验总结(六)
- php CodeIgniter 实战:主从数据库
- jd-core java反编译工具