第九章 控制抽象
2015-11-23 10:20
155 查看
在上一章中学习了函数值的概念,本章将要学习如何将函数值应用到创建新的控制抽象。
简化代码
所有的函数都可以分为通用部分和非通用部分
通用部分是函数体
非通用部分必须由参数提供
我们将这样的函数称为高阶函数,这使得我们有机会去组织和简化代码
柯里化
柯里化的函数被应用于多个参数列表,而不仅仅一个
可以写作:
还可以写作:
编写新的控制抽象
对于多个参数,先做柯里化
在传入一个参数时,可以用花括号代替小括号达到更像控制抽象的效果
传名参数
要实现传名参数,要定义参数的类型开始与 => 而不是 ()=>
需要将 ()=> 转换成 =>
括号内的表达式不会先于调用函数被评估,而是创建一个函数值,其apply方法将其评估,而这个函数值则会传递给调用函数
简化代码
所有的函数都可以分为通用部分和非通用部分
通用部分是函数体
非通用部分必须由参数提供
我们将这样的函数称为高阶函数,这使得我们有机会去组织和简化代码
def containsNeg(nums: List[Int]):Boolean = { var exists = false; for(num <- nums) if(num < 0) exists = ture; exists; }
如果我们在这里使用高阶函数exists:
def containsNeg(nums: List[Int]):Boolean = nums.exists(_ < 0);
就是如此的简洁!
柯里化
柯里化的函数被应用于多个参数列表,而不仅仅一个
def curriendSum(x: Int, y: Int) = { x + y; }
可以写作:
def curriendSum(x: Int)(y: Int) = { x + y; }
还可以写作:
def curriendSum(x: Int) = { (y: Int) => x + y; }
编写新的控制抽象
对于多个参数,先做柯里化
在传入一个参数时,可以用花括号代替小括号达到更像控制抽象的效果
def twice(x: Double, op: Double => Double) = op(op(x));
改写:
def twice(x: Double)(op: Double => Double) = op(op(x));
调用
twice(5) { _ + 1; }
这样看起来就更加像是内建的控制抽象了。
传名参数
要实现传名参数,要定义参数的类型开始与 => 而不是 ()=>
需要将 ()=> 转换成 =>
括号内的表达式不会先于调用函数被评估,而是创建一个函数值,其apply方法将其评估,而这个函数值则会传递给调用函数
相关文章推荐
- Windows下Scala环境搭建
- Windows7下安装Scala 2.9.2教程
- XML 文件解析--含Unicode字符的XML文件
- 分分钟掌握快速排序(Java / Scala 实现)
- Scala极速入门
- Spark初探
- Scala实现REST操作
- Scala method call syntax
- 关于Scala多重继承的菱形问题
- Scala 高阶函数(high-order function)剖析
- Spray.io搭建Rest服务
- Spray.io搭建Rest — 支持Twirl模板并部署
- 搭建hadoop/spark集群环境
- Akka (actors) remote example
- scala工具库
- scala-协变、逆变、上界、下界
- zeppelin入门使用
- ScalaMP ---- 模仿 OpenMp 的一个简单并行计算框架
- 用Scala实现延迟计算
- SBT学习 [持续更新...]