在 Go 中模拟 Haskell 的 fmap
在 Go 中模拟 Haskell 类型类时,无法让方法参数使用参数化类型是一个挑战。考虑以下尝试模拟 fmap 的示例:
type S[A any] struct { contents A } type Functor [A any, B any] interface{ fmap(f func(A)B) B } func (x S[A]) fmap (f func(A)B) S[B] { x.contents = f(x.contents) return x }
由于接口实现中未定义类型 B,此代码失败。
使用顶级函数的解决方法
由于 Go 方法无法引入新的类型参数,一种解决方法是将 fmap 实现为顶级function:
func Fmap[A, B any](sa S[A], f func(A) B) S[B] { return S[B]{contents: f(sa.contents)} }
替代方法
虽然此解决方法解决了眼前的问题,但它强调使用泛型和方法模拟 Haskell 类型类在 Go 中并不是一件简单的事情。替代方法可能包括:
以上是如何使用泛型在 Go 中有效模拟 Haskell 的'fmap”?的详细内容。更多信息请关注PHP中文网其他相关文章!