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