目录
1. 什么是函数式编程
编程范式的发展有两个正交的方向,一个是从数据和函数的封装的角度(Non-OOP to OOP), 另一个是数据和函数的关系角度(命令式编程(函数围绕数据)和函数式编程(数据围绕函数))。
命令式编程和函数式编程的区别有如下几点:
3 Assignment
- Pascal triangle:递归比较简单,退出条件也很明显,分别是
c==0
和c==r
的时候; - Parenthesis Balance:用一个
acc:Int
来存储,每遇见一个{
+1,}
-1。退出条件是chars.isEmpty
或者acc < 0
; - Counting Money稍微需要仔细思考,退出条件是
Money == 0
,和Money < 0 || coins.isEmpty
。
具体代码见这里。
4 总结
本节我们首先对什么是函数式编程做了一个总结:
- 函数无副作用;
- 通过函数转换不可变数据而非改变原有数据来获取新数据;
- 数据围绕函数而非函数围绕数据,函数也是一等公民。
在这基础上,我们回顾了作为函数式编程理论基础的λ-Calculus。λ-Calculus里最重要的3个概念是<expression>,<function>, <application>。<function>就是函数,<application>可以理解成函数调用。以函数为基础的λ-Calculus和以操作为基础的图灵机在计算能力上被证明是等价的,任何计算形式都可以被他们实现。现在的函数式编程和命令式编程正是基于λ-Calculus和图灵机发展过来。函数式编程的未来发展方向是和OOP结合,这也就是Scala背后的设计哲学。
对于函数,通过函数和变量的声明与定义的比较,可以看出他们同样拥有关键词,名称,类型,字面值,因此有理由在一个更抽象的层面将函数和变量统一对待。函数中类型 + 数据(其实是函数体)就是匿名函数,也就是Block。