开始之前
不建议新人学习scala函数式编程,学习scala函数式编程,需要起码的Java知识,因为很多scala特性编译后会转化成java代码,拥有扎实的Java基础可以极大的平滑学习曲线,提升学习体验。
如果对Scala有浓厚的兴趣,也可以从scala命令行尝试各种代码示例,本教程的代码注释会提供很多内容帮助理解,本文不涉及环境配置的初级内容,敬请谅解
(最初学习scala函数式编程这本天书的时候我也骂了作者很多次= =)。
1. 函数式编程
函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。
和指令式编程相比,函数式编程强调函数的计算比指令的执行重要。
和过程化编程相比,函数式编程里函数的计算可随时调用。
2. 副作用
a. 读取输入:readLine
b. 等待输入:readLine
c. 修改变量:var a = List(1); val a = a :+ 1
d. 打印输出:println()
e. 抛出异常:throw new Exception(“test”)
f. 读写文件:val test = scala.io.Source.fromFile(“/Users/lijp/test.txt”).getLines
g. 直接修改数据结构:val a = List(1, 2, 3); val a = a.zipWithIndex
h. 设置对象成员:略
i. 在屏幕绘图:略
3. 引用透明
引用透明:如果表达式e满足引用透明,那么e可以替换为e的运算结果,且不改变原程序的含义,换言之,引用透明一定不能修改原始数据或产生副作用。
4. 纯函数
纯函数:若表达式f(x)引用透明、且x引用透明,那么f是一个纯函数。
5. 引用透明、纯函数举例说明
// 1. 引用透明的例子
val x = "hello world"
var r1 = x.reverse
var r2 = x.reverse
// 使用x替换r1、r2中的x
val r1 = "hello world".reverse
val r2 = "hello world".reverse
// r1、r2结果保持不变,说明x引用透明
// 2. 引用不透明的例子
val x = new StringBuilder("hello world")
val y = x.append("world") // 这里的append方法有副作用,修改了原来的x
val r1 = y.toString
var r2 = y.toString
// 使用y替换r1、r2中的y,r2结果改变,相当于append执行了两次
val r1 = x.append("world").toString
val r2 = x.append("world").toString
// 说明y引用不透明,不是纯函数