例如现有 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 呢
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.