首页 >后端开发 >Golang >如何使用泛型在 Go 中有效模拟 Haskell 的'fmap”?

如何使用泛型在 Go 中有效模拟 Haskell 的'fmap”?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-19 16:52:13351浏览

How Can Haskell's `fmap` Be Effectively Emulated in Go Using Generics?

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn