高阶函数

高阶函数将其他函数作为参数和/或将它们作为结果返回。它们构成了函数式编程的构建块。例如,大多数函数语言都具有某种形式的过滤函数。这是一个高阶函数,将一个列表和一个谓词(返回 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

请注意,sumOfIntssumOfSquare 可以定义为:

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 作为参考。