跳轉到內容

計算機科學基礎/高階函式

來自華夏公益教科書

高階函式

[編輯 | 編輯原始碼]

高階函式提供了一種更強大的方法來概括問題的解決方案,它們允許程式碼塊將程式碼塊作為引數,並返回一個程式碼塊作為返回值。所有其他函式被稱為一階函式。數學中一個高階函式的例子是導數函式,它將函式作為輸入,併產生另一個函式(第一個函式的導數)作為輸出。在計算機科學中,map 函式接受一個任意函式和一個數據集(例如列表),並將函式應用於集合中的每個資料項。另一個例子是 reduce(或 fold)函式,它接受一個輸入函式和資料集,並使用函式生成資料集中所有專案的聚合。例如,如果輸入函式是加法,則 reduce 函式返回資料集中所有專案的總和作為輸出。如果輸入函式是乘法,則 reduce 函式產生資料集中所有專案的乘積。高階函式還允許我們使用現有的函式在執行時建立函式的組合。例如,給定兩個函式 以及 我們就可以建立一個函式 使得 .

以下指令碼使用內建的 map 程式碼塊/函式將同一個程式碼塊/函式應用於列表中的每個元素。

The built in map block (function) is used to apply a block (function) to each and every element in a list.

為了應用不同的函式,我們只需要找到或實現該函式,並將它用作 map 程式碼塊的第一個引數。下一個示例使用乘法函式,該函式接受兩個引數。Snap! 足夠智慧,能夠檢測到這一點,並在應用函式時使用列表的每個元素作為兩個引數。所以結果列表應該包含原始列表中元素的自乘結果。

The built in map block (function) is used to apply a block (function) to each and every element in a list. Because the function passed in takes two parameters when the function is applied to a element of the list the same element is used as both parameters.

這個 map 程式碼塊將對多個數據項應用同一個函式的這種模式概括為一個程式碼塊。它並非簡單的程式設計,因為有人必須編寫這個 map 程式碼塊(檢視原始碼以瞭解它有多複雜),但它讓程式設計師更開心,因為它讓思考部分變得更簡單。作為程式設計師,我們可以從擔心列表的迭代中解脫出來,從而專注於需要應用於列表的函式。

以下兩個示例使用 Snap! 中的內建 reduce 函式來計算一組數字的總和和乘積。

This block applies the addition function to each and every item in the list to calculate the total.

This block uses the built-in reduce function in Snap! to calculate the product of a list of numbers.

請注意,reduce(與…合併)函式可以接受任何具有兩個輸入引數的函式來將一組值聚合為單個值。透過使用高階函式,我們可以建立可以定製以解決更大範圍問題的通用解決方案。

返回程式碼塊作為資料

[編輯 | 編輯原始碼]

以下程式碼塊演示了程式碼塊作為資料的用法。在這個程式碼塊中,兩個報告程式碼塊被作為引數傳入,然後用於形成報告值 - 一個新的程式碼塊。新程式碼塊將兩個輸入報告程式碼塊應用於某個未知的輸入值。請注意,報告值周圍的“環”(灰色框架)非常重要。任何包含在“環”中的內容都將被視為資料而不是程式。兩個函式的應用不會被評估,而是簡單地返回為資料,而不進行評估,這正是我們在這個高階函式中想要的。

This block takes two (reporter) blocks as input parameters and reports a new block as the output. The function of the new block is the composition of the two functions represented by the two input blocks - when the new block is called it takes the input to the new block, applies the two functions (specified when the new block is created) to the input, and reports the result.

為了使用組合後的函式,我們可以使用兩個輸入函式呼叫 compose 函式,並使用“call”程式碼塊對輸入值執行組合後的程式碼塊,如以下指令碼所示。

The compose block is called to form a composed block (function) from the two input blocks. The composed block is then applied to the input value of 3. The result of this block call is 1+2+3=6.

有了這個“compose”程式碼塊,我們可以透過在執行時結合現有的函式來定義新函式 - 當我們需要它們時。這是一種強大的概括方法,如果沒有使用高階函式,我們就無法實現。

華夏公益教科書