您的位置:首页 > 其它

第九章 控制抽象

2015-11-23 10:20 155 查看
在上一章中学习了函数值的概念,本章将要学习如何将函数值应用到创建新的控制抽象。

简化代码

所有的函数都可以分为通用部分和非通用部分

通用部分是函数体

非通用部分必须由参数提供

我们将这样的函数称为高阶函数,这使得我们有机会去组织和简化代码

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方法将其评估,而这个函数值则会传递给调用函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  scala 控制抽象