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

大家好,又见面了,我是 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 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

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

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


更多精彩请扫码关注如下公众号。

Written on September 1, 2023