## 功能範式(The Functional Paradigm)函數式編程基於簡單的規則,目的是使程式保持一致,使並行(更)人性化和簡單化,函數是存粹的,它不會改變(變數的)狀態,不會改變對象,也不共用狀態,代碼是聲明式的,計算只不過是數學函數的一種實現。我們來看一個純粹的函數語言的函數例子:```isPalindrome :: (Eq a) => [a] -> BoolisPalindrome x = x == reverse x```上面的代碼是 haskell 版本的 palindrome 函數,我們(實際上)都在某種程度上通過迴圈來遍曆列表,以及檢查...,在 Haskell 中,isPalindrome 函數擷取 Equality 的字元列表(考慮比較時),並返回一個 bool 值(True 或者 False)。實現(這個功能)只需一行代碼:```x == reverse x```將參數和 reverse 輸出進行比較,reverse 是一個反轉列表的函數。我們來看如何在 Golang 中實現一個相似的函數,從一個遞迴版本的 reverse 開始吧:```gofunc reverse(str string) string {if str == "" {return str} else {return reverse(str[1:]) + string(str[0]) // a string is a byte array in golang}}```現在我們有了一個名為 reverse 的函數,讓我們再看一下如何? isPalindrome ,用類似於函數的方式。```gofunc isPalindrome (str string) {return str == reverse(str)}```就像你看到的,我們最終用幾行代碼就寫了一個大家一看就懂的函數,在大多數情況下,非常有名的函數都可以實現 go 語言的版本,函數在 golang 中是第一公民,所以我們可以做一些類似下面的實現:```goisPalindrome := func (str string) {return str == reverse(str)}isPalindrome("radar")```這隻是 golang 功能中很小的一部分,還有很多 go 語言實現中有大量最佳化的地方的例子,例如 go 中的 map,reduce,和 filter,一個好的實踐方法是最佳化它們,並使用它們。例如,資料處理在 golang 中的速度要比 python 快得多,所以,(雖然)我(都)可以建立一個資料管道來清理和組織我的資料,但如果我願意用 golang 實現的話,將更快。假設我有一個數值列表,我想要用一種優雅的方式,通過一組函數來處理這個列表中的數值:```gotype p func(int) intfunc apInt(functions []p, numbers []int) []int{j := 0output := make([]int,0)for _,f := range functions {for j < len(numbers) {fmt.Println(f(numbers[j]))output = append(output,f(numbers[j]))j++}}return output}```上面的 functions,是一個類似於如下聲明的函數數組:```golistOfFuncs := []p{a, b}```它能夠在所有的整型切片中工作,並且沒有副作用。我剛為 [lori](https://github.com/radicalrafi/lori) 工作,它是一個 Golang 庫,目標是為開發人員提供這些有用的東西,並使 function 變得有趣和可能。
via: https://radicalrafi.github.io/posts/functional-go/
作者:radicalrafi 譯者:gogeof 校對:polaris1119
本文由 GCTT 原創編譯,Go語言中文網 榮譽推出
本文由 GCTT 原創翻譯,Go語言中文網 首發。也想加入譯者行列,為開源做一些自己的貢獻嗎?歡迎加入 GCTT!
翻譯工作和譯文發表僅用於學習和交流目的,翻譯工作遵照 CC-BY-NC-SA 協議規定,如果我們的工作有侵犯到您的權益,請及時聯絡我們。
歡迎遵照 CC-BY-NC-SA 協議規定 轉載,敬請在本文中標註並保留原文/譯文連結和作者/譯者等資訊。
文章僅代表作者的知識和看法,如有不同觀點,請樓下排隊吐槽
322 次點擊