高阶函数
高阶函数将其他函数作为参数和/或将它们作为结果返回。它们构成了函数式编程的构建块。例如,大多数函数语言都具有某种形式的过滤函数。这是一个高阶函数,将一个列表和一个谓词(返回 true 或 false 的函数)作为参数。
不兼顾这些的功能通常被称为 first-order functions
。
function validate(number,predicate) {
if (predicate) { // Is Predicate defined
return predicate(number);
}
return false;
}
这里谓词是一个函数,它将测试涉及其参数的某些条件并返回 true 或 false。
以上的示例调用是:
validate(someNumber, function(arg) {
return arg % 10 == 0;
}
);
常见的要求是在一个范围内添加数字。通过使用高阶函数,我们可以扩展这个基本功能,在每个数字上应用转换函数,然后将其包含在总和中。
你想要添加给定范围内的所有整数(使用 Scala)
def sumOfInts(a: Int, b: Int): Int = {
if(a > b) 0
else a + sumOfInts(a+1, b)
}
你想要在给定范围内添加所有整数的平方
def square(a: Int): Int = a * a
def sumOfSquares(a: Int, b: Int): Int = {
if(a > b) 0
else square(a) + sumOfSquares(a + 1, b)
}
注意这些东西有一个共同点,就是你想在每个参数上应用一个函数然后添加它们。
让我们创建一个更高阶的函数来做到这两点:
def sumHOF(f: Int => Int, a: Int, b: Int): Int = {
if(a > b) 0
else f(a) + sumHOF(f, a + 1, b)
}
你可以这样称呼它:
def identity(a: Int): Int = a
def square(a: Int): Int = a * a
请注意,sumOfInts
和 sumOfSquare
可以定义为:
def sumOfInts(a: Int, b: Int): Int = sumHOF(identity, a, b)
def sumOfSquares(a: Int, b: Int): Int = sumHOF(square, a, b)
从这个简单的例子中可以看出,高阶函数提供了更通用的解决方案并减少了代码重复。
我使用 Scala By Example - 由 Martin Odersky 作为参考。