Go 程式設計教學:高階函式 (Higher-Order Function)

PUBLISHED ON NOV 16, 2017 — PROGRAMMING

    許多高階函式的思維,在於對串列 (list) 的操作,在 Go 語言中,可以用切片代替串列。在高階函式中,有幾個常見的模式 (pattern),在不同的程式語言或框架會有不同的名字,但精神是相通的。筆者在這裡介紹一些模式,做為各位讀者撰寫高階函式的參考。

    filter

    fliter 函式接收一個串列及條件函式,回傳符合條件函式的新串列。有些程式語言會用 grepselect 等同概念但異名的函式。

    map

    map 函式接收一個串列和轉換函式,每個元素經轉換函式轉換,最後回傳一個新的串列。有些程式語言用 apply 等名稱。

    reduce

    reduce 函式接受一個串列和一個縮減函式,回傳一個單一值。有時候又稱為 fold 或其他名稱。

    partition

    partition 函式接受一個串列和判斷函式,該函式會依據判斷函式,將原串列分為兩個新的串列。見下例:

    fold

    fold 函式接受兩個等長的串列,將其合併為一個新的串列,每個串列的元素是以兩個串列的元素組合而成的元組 (tuple)。在 Go 語言中,沒有內建的元組,以結構取代。見下例:

    要注意的是,我們為了要保存 zip 函式內部的計數器狀態,我們將其寫成迭代器 (iterator),這裡應用到先前提過的閉包。當迭代器結束時,ok 會回傳 false,這時就離開迴圈。

    enumerate

    enumerate 函式接收一個串列,回傳以原串列元素和其索引值為元素的新串列。見下例:

    同樣地,我們在這裡使用迭代器。

    組合數個高階函式

    高階函式間,可以相互組合,達到複合的效果,如下例:

    comments powered by Disqus