Scala函数式编程原则笔记 Week-1

#编程范式

  1. 命令式 (imperative)编程语言: C++, Java
  2. 函数式(functional)编程语言: Lisp, Scala, Haskwell
  3. 逻辑式(logic)编程语言:Prolog
  4. 面向对象编程

面向对象编程可以和前三种任意一种相结合

#命令式编程

  • 拥有可修改的变量
  • 变量分配
  • 结构控制语句: 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)的编程方法
  • 在函数式编程语言中,函数是一等公民:
    • 函数可以在任何地方被定义,甚至是其他函数内部
    • 函数可以像参数一样被传递给其他函数,或者是作为结果被返回
    • 相对于其他值, 函数是由一系列操作符组成的

##函数编程语言,表达式计算过程

  1. 取表达式最左边的操作符
  2. 计算操作符两边的操作数(递归)
  3. 应用操作符到两边的操作数

##函数参数与返回值 函数的定义中可以包含参数与返回值:

def power(x: Double, y: Int): Double =...

##函数的计算过程

  1. 首先从左至右计算函数表达式的所有参数
  2. 用函数等式右边的表达式替换函数
  3. 同时,用参数计算后的值,替代原有的参数。
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

转载于:https://my.oschina.net/u/189332/blog/714684

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值