計算機科學基礎/高階函式
高階函式提供了一種更強大的方法來概括問題的解決方案,它們允許程式碼塊將程式碼塊作為引數,並返回一個程式碼塊作為返回值。所有其他函式被稱為一階函式。數學中一個高階函式的例子是導數函式,它將函式作為輸入,併產生另一個函式(第一個函式的導數)作為輸出。在計算機科學中,map 函式接受一個任意函式和一個數據集(例如列表),並將函式應用於集合中的每個資料項。另一個例子是 reduce(或 fold)函式,它接受一個輸入函式和資料集,並使用函式生成資料集中所有專案的聚合。例如,如果輸入函式是加法,則 reduce 函式返回資料集中所有專案的總和作為輸出。如果輸入函式是乘法,則 reduce 函式產生資料集中所有專案的乘積。高階函式還允許我們使用現有的函式在執行時建立函式的組合。例如,給定兩個函式 和 以及 和 我們就可以建立一個函式 使得 .
以下指令碼使用內建的 map 程式碼塊/函式將同一個程式碼塊/函式應用於列表中的每個元素。
為了應用不同的函式,我們只需要找到或實現該函式,並將它用作 map 程式碼塊的第一個引數。下一個示例使用乘法函式,該函式接受兩個引數。Snap! 足夠智慧,能夠檢測到這一點,並在應用函式時使用列表的每個元素作為兩個引數。所以結果列表應該包含原始列表中元素的自乘結果。
這個 map 程式碼塊將對多個數據項應用同一個函式的這種模式概括為一個程式碼塊。它並非簡單的程式設計,因為有人必須編寫這個 map 程式碼塊(檢視原始碼以瞭解它有多複雜),但它讓程式設計師更開心,因為它讓思考部分變得更簡單。作為程式設計師,我們可以從擔心列表的迭代中解脫出來,從而專注於需要應用於列表的函式。
以下兩個示例使用 Snap! 中的內建 reduce 函式來計算一組數字的總和和乘積。
請注意,reduce(與…合併)函式可以接受任何具有兩個輸入引數的函式來將一組值聚合為單個值。透過使用高階函式,我們可以建立可以定製以解決更大範圍問題的通用解決方案。
以下程式碼塊演示了程式碼塊作為資料的用法。在這個程式碼塊中,兩個報告程式碼塊被作為引數傳入,然後用於形成報告值 - 一個新的程式碼塊。新程式碼塊將兩個輸入報告程式碼塊應用於某個未知的輸入值。請注意,報告值周圍的“環”(灰色框架)非常重要。任何包含在“環”中的內容都將被視為資料而不是程式。兩個函式的應用不會被評估,而是簡單地返回為資料,而不進行評估,這正是我們在這個高階函式中想要的。
為了使用組合後的函式,我們可以使用兩個輸入函式呼叫 compose 函式,並使用“call”程式碼塊對輸入值執行組合後的程式碼塊,如以下指令碼所示。
有了這個“compose”程式碼塊,我們可以透過在執行時結合現有的函式來定義新函式 - 當我們需要它們時。這是一種強大的概括方法,如果沒有使用高階函式,我們就無法實現。
