龙空技术网

fp-go - 专为 Go 语言设计的函数式编程库

GitHub项目精选 1478

前言:

目前我们对“fp编程”都比较关切,咱们都想要剖析一些“fp编程”的相关内容。那么小编同时在网上收集了一些有关“fp编程””的相关内容,希望看官们能喜欢,朋友们快快来了解一下吧!

大家好,又见面了,我是 GitHub 精选君!

背景介绍

在编程领域中,函数式编程是一种编程范式,它将计算视为函数的评估,避免改变状态和可变数据。然而,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 httpimport (    "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(";, 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 趋势图(代表项目的活跃程度):

更多项目详情请查看如下链接。

开源项目地址:

开源项目作者:IBM

以下是参与项目建设的所有成员:

关注我们,一起探索有意思的开源项目。

标签: #fp编程 #fp编程器