Scala可以把函数作为参数传递给另一个函数。即可以写出这样的高阶函数函数:f(g(x)) 。下面举一个高阶函数的例子。
假如要求写一个求和函数, 它接受一个参数f(n),返回一个从整数a到整数b的求和函数。
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 // sum need to return a function
}
sum(x => x*x) 意为sum接受一个 f : x => x*x 的函数作为参数所返回的对x的平方求和的函数。这个新得到的二阶函数有两个参数 ,sum(x => x*x)(1,3) 即为从1到3求其平方和。
类似的还可以写出sum(x => x*x*x + 2*x*x + 4*x+5)等二阶函数。
同时也应该注意到sum函数中嵌套了sumF函数,因为sum必须返回一个函数而不是数值,所以定义了一个sumF函数作为返回的函数。
拓展: 也可以使用Currying ,sum 返回 Int 值,利用Curring构造函数。这时,sum不再是高阶函数。
def sum(f: Int => Int)(a:Int)(b:Int) : Int={
if(a >b) 0
else f(a)+ sum(f)(a+1)(b)
}
val sumSquare = sum(x => x*x)_