Golang 范型问题, 如何让接口方法接受未在接口范型参数中声明的类型

2023-01-08 16:40:30 +08:00
 yangbin9317

例如现有 Result 和 Option 两种类型

type Result[T any] struct {
	Error  err
	Value T
}

type Option[T any] sturct {
	None  bool
	Some T
}

现有一个 Option[string], 我想把它转换成 int, 但是 string 可能不合法, 所以写一个函数返回 Option[int]

func MyAtoI(string a) Option[int]

但是希望给类似 Result 和 Option 这样的容器实现一种接口 I, 包含一个叫 Bind 的方法, 这个方法负责把容器打开, 把参数应用到容器的内容物上, 并返回另一个实现了接口 I 的容器, 例如

var optionInt Option[int] = result.Bind(MyAtoI)

我想象中 Bind 的签名是

type I[T any] interface {
    Bind[U any](func(T any) I[U]) I[U] // interface method must have no type parameters
}

但是会报错: interface method must have no type parameters, 需要把类型参数放到接口签名里

type I[T, U any] interface {
	Bind(func(T any) I[T, U]) I[T, U]
}

但这样 Bind 返回的类型就只能是 I[T, U]了, 不符合预期, 如何让 Bind 可以返回任意的 I 呢

766 次点击
所在节点    问与答
3 条回复
Jirajine
2023-01-08 16:44:18 +08:00
你对 go 的类型系统抱有了过高的期待
hsfzxjy
2023-01-08 17:13:00 +08:00
golang 这破类型系统不要想玩 monad 了
Trim21
2023-01-08 17:32:22 +08:00
go 的泛型暂时还不支持你这么写。未来倒是有可能。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/907378

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX