Scala学习笔记-第十二章高阶函数

Scala学习笔记-第十二章高阶函数

函数是“头等公民”,可以像任何其他数据类型一样被传递和操作。

作为值的函数

val num=3.14
val fun=ceil_//这里将max方法转成了函数并作为值赋予给了fun变量。
//fun的类型是(Double)=>Double

fun(num)//4.0,调用fun
Array(3.14,1.42,2.0).map(fun)
//Array(4.0,2.0,2.0),将fun传递给Array中的每一个元素

带函数参数的函数 ( 高阶函数

def valueAtOneQuarter ( f:(Double)=>Double ) = f(0.25)
valueAtOneQuarter(ceil_) //1.0 , ceil(0.25)
valueAtOneQuarter(sqrt_) //0.5 , sqrt(0.25)

//这里函数valueAtOneQuarter的参数是 函数f:(Double)=>Double
//valueAtOneQuarter的类型是: ( (Double)=>Double )=>Double

一个例子:

def mulBy(factor:Double) = (x:Double)=>factor * x 
//mulBy的类型为 Double => ( (Double)=>Double )
//mulBy接受一个Double参数,产出一个 (Double)=>Double 的函数

val quintuple = mulBy(5) // (x:Double)=> 5 * x
quintuple(20)   //100

一些高阶函数

map:将一个函数应用到某个集合的所有元素并返回值。

(1 to 9).map(0.1 * _)   // (0.1,0.2,0.3,...,0.9) 

foreach:将一个函数应用到某个集合所有元素但不返回值。

1 to 9).map("*" * _).foreach(println _) // 打印出一个直角三角形

fliter:输出所有匹配某个特定条件的元素。

(1 to 9).filter(_ %2== 0)  // 2,4,6,8

reduceLeft: 接受一个二元函数,并将它应用到序列中的所有元素,从左到右

(1 to 9).reduceLeft(_ * _)  //(...((1*2)*3)*4....*9)

sortWith: 二元函数,排序。

"Mary has a little lamb.".split(" ").sortWith(_.length<_.length)
//输出一个按长度递增排序的数组。

柯里化

柯里化的表现形式是:一个带有分开的两个参数(两个括号)的函数。

将原来接受两个参数的函数变成新的接受一个参数的过程,新的函数返回一个以原有第二个参数作为参数的函数。

def mul(x:Int,y:Int)=x*y
def mulOneAtTime(x:Int)=(y:Int)=>x*y
def mulOneAtTime(x:Int)(y:Int)=x*y //上一步的简写

mul(6,7) //42
mulOneAtTime(6)(7)  //42

控制抽象

将一系列与归组成不带参数也没有返回值的函数。

 def until(condition:=>Boolean) (block:=>Unit) {
 //这里将 condition:()=>Boolean 省略成了 condition:=>Boolean
 //这个参数叫“换名调用参数”,与“换值调用参数不同”,函数调用时,参数表达式不会被求值。表达式成为无参函数的函数体,而该函数被当作参数传递下去
    if (! condition) {
        block
        until(condition) (block)
    }
}

var x=10
until(x==0){
    x-=1
    println(x)
}

在上例中,until是柯里化过的。先处理condition,然后把block当作完全独立的另一个参数。如果没有柯里化,我们在调用until时:

until(x==0,{...})   //就没那么漂亮了

return的作用

函数的返回值就是函数体的值(最后一个式子),不需要用return来返回函数值。

但,return从一个匿名函数中返回一个值给包含这个匿名函数的带名函数,这对于控制抽象是很有用的。

def indexOf(str:String,ch:Char):Int={
    var i= 0
    until (i==str.length){
        if(str(i)==ch) return i
        i+=1
    }//这个匿名函数的值传递给until。
    return -1 //当这句话执行时,indexOf终止并返回-1。我们需要在带名函数定义时给出返回值类型 "  Int=  "
}

总结

高阶函数即是函数的迭代功能,函数的参数可以是另一个函数,我们在使用高阶函数时应分析其参数类型及产出结果类型。
柯里化是一个有用的手段,它表示了一个处理过程的分段化,其实可以看成高阶函数的另一面。
控制抽象,名字来源应该是他代表控制结构的抽象化,我们可以使用换命调用方法简化控制结构的代码。知道原理即可。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值