Higher-Order Functions
def sum(f: Int => Int, a: Int, b: Int): Int =
if (a > b) 0
else f(a) + sum(f, a + 1, b)
def sumInts(a: Int, b: Int) = sum(id, a, b)
def sumCubes(a: Int, b: Int) = sum(cube, a, b)
def sumFactorials(a: Int, b: Int) = sum(fact, a, b)
def id(x: Int): Int = x
def cube(x: Int): Int = x * x * x
def fact(x: Int): Int = if (x == 0) 1 else fact(x - 1)
Anonymous(匿名函数)
例如: (x: Int) => x * x * x
下面是匿名函数的定义形式:
(x1 : T1; :::; xn : Tn) ) E
等价于
{def f(x1 : T1; :::; xn : Tn) = E; f }
匿名函数的形式
def sumInts(a: Int, b: Int) = sum(x => x, a, b)
def sumCubes(a: Int, b: Int) = sum(x => x * x * x, a, b)
def sumFactorials(a: Int, b: Int) = sum(fact, a, b)
Currying
柯里化
返回函数的函数
例如:
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
}
然后可以def这么定义:
def sumInts = sum(x => x)
def sumCubes = sum(x => x * x * x)
def sumFactorials = sum(fact)
也可以用值定义
val sumInts = sum(x => x)
val sumCubes = sum(x => x * x * x)
val sumFactorials = sum(fact)
如何使用?
sumCubes(1, 10) + sumFactorials(10, 20)
对于这种返回函数的函数,Scala有专门的符合来来编程:
def sum(f: Int => Int)(a: Int, b: Int): Int =
if (a > b) 0 else f(a) + sum(f)(a + 1, b)