#编程范式
- 命令式 (imperative)编程语言: C++, Java
- 函数式(functional)编程语言: Lisp, Scala, Haskwell
- 逻辑式(logic)编程语言:Prolog
- 面向对象编程
面向对象编程可以和前三种任意一种相结合
#命令式编程
- 拥有可修改的变量
- 变量分配
- 结构控制语句: if-then-else, loops, break, coninue, return
命令式编程的问题
- 可修改的变量 => memory cells
- 变量的解应用(dereference) => load 指令
- 变量分配 => store 指令
- 结构控制语句 => jumps 指令
单纯的命令式编程受限于“冯诺依曼”瓶颈: CPU高速的计算能力与内存较慢的读取能力。
One tends to conceptualize data structures word-by-word. 命令式编程倾向于逐字逐句地将数据结构概念化。
#函数式编程
- 严格意义上的函数式编程没有可修改的变量,分配语句,loops等结构控制语句
- 广义的上来讲,函数式编程指专注于函数(function)的编程方法
- 在函数式编程语言中,函数是一等公民:
- 函数可以在任何地方被定义,甚至是其他函数内部
- 函数可以像参数一样被传递给其他函数,或者是作为结果被返回
- 相对于其他值, 函数是由一系列操作符组成的
##函数编程语言,表达式计算过程
- 取表达式最左边的操作符
- 计算操作符两边的操作数(递归)
- 应用操作符到两边的操作数
##函数参数与返回值 函数的定义中可以包含参数与返回值:
def power(x: Double, y: Int): Double =...
##函数的计算过程
- 首先从左至右计算函数表达式的所有参数
- 用函数等式右边的表达式替换函数
- 同时,用参数计算后的值,替代原有的参数。
sumOfSquares(3, 2+2)
sumOfSquares(3, 4)
square(3) + square(4)
3*3 + square(4)
9+ square(4)
9 + 4 * 4
9 + 16
25
##替换( substitution)模型
上面这种表达式求值的方式,被称为替换模型。 这种模型的根本思想是,所有的求值计算都是将表达式简化为值得过程
##名调用与值调用 值调用:函数的每个参数只求值一次 名调用:如果参数没有被使用,那么它不会被立即求值
##Scala求值策略 默认情况下Scala使用call-by-value的求值策略,如果函数参数声明方式为“ =>”,表示采用class-by-name的策略。
def constOne(x: Int, y: => Int)
##条件表达式 Scala中的条件判断表达式与Java中的if-else语句类似,不过Scala中的if-else和 +, -, % 一样是一个表达式(expression),而不是程序语句(statement)。
def abs(x: Int) = if (x >= 0) x else -x
上述代码中,如果if判断为真,表达式的值 x, 否则表达式的值为 -x。
##值定义 根据在使用过从中调用策略的不同,变量的定义也分为两种:
-
by-name def x = 2 + 5
-
by-value def y = square(x)
在每一次调用x时,Scala会采取call-by-name的策略, 调用y,采取call-by-value.
##内部函数 Scala允许在函数内部定义函数,在函数内部定义的函数,是无法从函数外部进行访问的。
def outer(x: Double) = {
def nestFun() = ....
}
##代码块(blocks) 在Scala中用花括号中的代码,被称为代码块。代码块中包含了一系列的定义或者表达式,代码块中最后一行表达式定义了代码块2的值(记住在严格的函数式编程语言中是没有return语句的)。 代码块本身就是一个表达式,可以出现在其他表达式的任意位置。
{
val x = f(3)
x * x
}
##代码块与可见性 代码块内部定义的变量只在代码块内部可见,代码块内部的定于会遮掩代码块外部相同定义的变量。
val x = 0
def f(y: Int) = y + 1
val result = {
val x = f(3)
x * x
}
##分号 在Scala中分号作为表示语句结束的标志,大多数时候是可以省略的,除非在一行中包含了多个语句。
val y = x + 1; y * y
如果一个语句跨越了多行,Scala会认为他们是多个语句,解决的办法是将语句包含在括号内, 或者将操作符置于行尾。
( expression_1
+ expression + 2) +
expression + 3