高階函式

高階函式將其他函式作為引數和/或將它們作為結果返回。它們構成了函數語言程式設計的構建塊。例如,大多數函式語言都具有某種形式的過濾函式。這是一個高階函式,將一個列表和一個謂詞(返回 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 作為參考。