專爲 Go 語言設計的函數式編程庫 fp-go

背景介紹

在編程領域中,函數式編程是一種編程範式,它將計算視爲函數的評估,避免改變狀態和可變數據。然而,Go 語言並沒有內建對函數式編程的支持,這使得在 Go 語言中實現函數式編程變得困難。

今天要給大家推薦一個 GitHub 開源項目 IBM/fp-go,該項目在 GitHub 有超過 1.1k Star,用一句話介紹該項目就是:“functional programming library for golang”。給 Go 語言插上翅膀。

項目介紹

fp-go 是一個功能強大的函數式編程庫,專爲 Go 語言設計。它的設計目標是提供一套數據類型和函數,使得在 Go 語言中編寫可維護和可測試的代碼變得簡單而有趣。它鼓勵以下編程開發模式:

1、編寫許多小型、可測試和純函數;

2、提供幫助器以將副作用隔離到延遲執行的函數(IO)中;

3、公開一致的組合集,以從現有函數創建新函數。

此外,每個數據類型都有一小組組合函數,這些函數在所有數據類型中的名稱相同,因此你只需要學習少量的函數名稱,同名函數的語義在所有數據類型中都是一致的。

如何使用

首先,你需要使用 "go get github.com/IBM/fp-go" 命令來獲取這個庫。然後,你可以參考提供的樣本來開始使用。這個庫強烈推崇使用小型、純粹的函數,這些函數只根據它們的輸入產生輸出,不執行任何副作用。同時,它提供了一些幫助器,可以將副作用隔離到延遲執行的函數(IO)中。

以下是一個簡單的示例,並行發起多個 HTTP 請求。

package http

import (
    "context"
    "fmt"
    "testing"

    HTTP "net/http"

    A "github.com/IBM/fp-go/array"
    R "github.com/IBM/fp-go/context/readerioeither"
    H "github.com/IBM/fp-go/context/readerioeither/http"
    E "github.com/IBM/fp-go/either"
    F "github.com/IBM/fp-go/function"
    IO "github.com/IBM/fp-go/io"
    "github.com/stretchr/testify/assert"
)

type PostItem struct {
    UserId uint   `json:"userId"`
    Id     uint   `json:"id"`
    Title  string `json:"title"`
    Body   string `json:"body"`
}

func idxToUrl(idx int) string {
    return fmt.Sprintf("https://jsonplaceholder.typicode.com/posts/%d", idx+1)
}

// TestMultipleHttpRequests shows how to execute multiple HTTP requests in parallel assuming
// that the response structure of all requests is identical, which is why we can use [R.TraverseArray]
func TestMultipleHttpRequests(t *testing.T) {
    // prepare the http client
    client := H.MakeClient(HTTP.DefaultClient)
    // readSinglePost sends a GET request and parses the response as [PostItem]
    readSinglePost := H.ReadJson[PostItem](client)

    // total number of http requests
    count := 10

    data := F.Pipe3(
        A.MakeBy(count, idxToUrl),
        R.TraverseArray(F.Flow3(
            H.MakeGetRequest,
            readSinglePost,
            R.ChainFirstIOK(IO.Logf[PostItem]("Log Single: %v")),
        )),
        R.ChainFirstIOK(IO.Logf[[]PostItem]("Log Result: %v")),
        R.Map(A.Size[PostItem]),
    )

    result := data(context.Background())

    assert.Equal(t, E.Of[error](count), result())
}

項目推介

fp-go 是 IBM 公司開發的一款開源項目,儘管它還在開發中,但已經達到了 1.0 的主要版本。它受到了強大的 fp-ts 的影響,是一個非常有潛力的項目。此外,它遵循了 Go 語言的設計哲學,每個包都有一個單一的目的,明確處理錯誤,避免包級狀態,簡單性至上等。如果你在尋找一個能夠幫助你在 Go 語言中實現函數式編程的庫,那麼 fp-go 絕對值得你一試。

以下是該項目 Star 趨勢圖(代表項目的活躍程度):

更多項目詳情請查看如下鏈接。

開源項目地址:https://github.com/IBM/fp-go

開源項目作者:IBM

以下是參與項目建設的所有成員:

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/rcNdgtU5Es7VJiuDQjA2YA