函数式编程
函数式编程是一种编程模型,它将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念。
函数式编程的应用场景:
1.数学推理
2.并行程序
函数式编程语言的代表语言:Lisp、HasKell、Erlang、Scala,F#
函数式编程的复兴:
多核并行程序设计的逐渐流行,而命令式编程天生的缺陷却使并行编程模型变得非常复杂,无论是信号量,还是锁的概念,都使程序员不堪其重。
对象是面向对象的第一型,那么函数式编程也是一样,函数是函数式编程的第一型。
我们在函数式编程中努力用函数来表达所有的概念,完成所有的操作。
在面向对象编程中,我们把对象传来传去,那在函数式编程中,我们要做的是把函数传来传去,而这个,说成术语,我们把他叫做高阶函数。
在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:
1.接受一个或多个函数作为输入
2.输出一个函数
在函数式编程中,函数是基本单位,是第一型,他几乎被用作一切,包括最简单的计算,甚至连变量都被计算所取代。在函数式编程中,变量只是一个名称,而不是一个存储单元,这是函数式编程与传统的命令式编程最典型的不同之处。
一切问题,归根结底到最后都是数学问题。
函数式编程的抽象本质:
相信每个程序员都对抽象这个概念不陌生。
在面向对象编程中,我们说,类是现实事物的一种抽象表示。那么抽象的最大作用在就在于抽象事物的重用性,一个事物越具体,那么他的可重用性就越低,因此,我们再打造可重用性代码,类,类库时,其实在做的本质工作就在于提高代码的抽象性。而再往大了说开来,程序员做的工作,就是把一系列过程抽象开来,反映成一个通用过程,然后用代码表示出来。
在面向对象中,我们把事物抽象。而在函数式编程中,我们则是在将函数方法抽象,函数一样是可重用,可置换的抽象单位。
那么我们说函数式编程的抽象本质则是将函数也作为一个抽象单位,而反映成代码形式,则是高阶函数。
递归是函数式编程的一个重要的概念,循环可以没有,但是递归对于函数式编程却是不可或缺的。递归充分地发挥了函数的威力,也解决了函数式编程无状态的问题。
递归其实就是将大问题无限地分解,直到问题足够小。
而递归与循环在编程模型和思维模型上最大的区别则在于:
循环是在描述我们该如何地去解决问题。
递归是在描述这个问题的定义。
惰性求值与并行(感觉很经典)
惰性求值,相当于就是指,一些未知用处的程序先不执行,在它需要被用到的时候,才会一起执行(这时候就可能会有较多的语句需要被执行,就需要考虑并行的问题了)。