您的位置:首页 > 其它

Thinking in scala (6)----高阶函数----返回一个函数

2014-10-31 10:14 274 查看
Thinking in scala (5)----高阶函数* 里面,我们演示了如何把一个函数作为参数传递给另外一个函数。

在本文里面,我们来演示函数式编程另外一个重要的特性:返回一个函数。首先来看这么一段代码:

code piece 1:

def sum(f:Int=>Int):(Int,Int)=>Int={
def sumF(a:Int,b:Int):Int=
if(a>b) 0
else f(a)+sumF(a+1,b)
sumF
}


一点点来看,f:Int=>Int 是sum函数接收的参数,该参数是一个函数。

":" 号后面的 (Int,Int) => Int 是sum函数的返回值,又(Int,Int) => Int是一个函数的类型:接收两个Int型的数,

返回一个Int的数。也就是说调用sum函数,其返回的值是一个函数。 这一点对于已经习惯C、C++、Java等编程语言的

程序员来说有一点难以理解。

继续看例子吧,如果执行下面的一行代码会发生什么呢?

sum(x=>x*x)(1,4)


结果会返回30。为什么是30呢? 30= 1^2+ 2^2 + 3^2 + 4^2.

首先,sum(x=>x*x) 是一个函数,并且sum(x=>x*x)的类型是(Int,Int)=>Int,正因为sum(x=>x*x)是一个函数,

所以它才可以继续接收参数(1,4).

好吧,我可能没有把这个事儿说清楚,实在是太抽象了。但是,读者应该有了一个基本的印象,那就是:

在函数式编程里面,函数f可以接收函数g作为参数,也可以返回函数h。

到这里还没完。。。。。。

Scala里面可以继续对code piece1 进行简化,如下:

code piece2:

object higherorderfuntion{
def sum(f:Int=>Int)(a:Int,b:Int):Int={
if(a>b) 0  else f(a)+sum(f)(a+1,b)
}

def fac(a:Int):Int=
{
def loop(a:Int,acc:Int):Int=
if(a==0) acc
else loop(a-1,a*acc)
loop(a,1)
}
def main(args:Array[String])={
println(sum(x=>x)(1,4))
println(sum(x=>x*x*x)(1,4))
println(sum(fac)(1,4))
}

}


这里我们需要特别注意,这里sum函数的参数列表变成了两个:(f:Int=>Int)和(a:Int,b:Int)

在scala里面,函数可以有多个参数列表。比如下面的函数定义:

def f(args_1)(args_2)...(args_n)=E


E代表一个函数体,且n>1

那么上述定义等价于:

def f(args_1)(args_2)...(args_n-1)={def g(args_n)=E;g}


还是以code piece2中的sum函数为例:

def sum(f:Int=>Int)(a:Int,b:Int):Int={
if(a>b) 0  else f(a)+sum(f)(a+1,b)
}


等价于:

def sum(f:Int=>Int):(Int,Int)=>Int={
def g(a:Int,b:Int):Int =
if(a>b) 0  else f(a)+sum(f)(a+1,b)
g
}


这个定义和code piece1中的sum函数的定义是一致的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: