ホームページ >バックエンド開発 >Golang >ジェネリックスを使用して、Haskell の「fmap」を Go で効果的にエミュレートするにはどうすればよいでしょうか?

ジェネリックスを使用して、Haskell の「fmap」を Go で効果的にエミュレートするにはどうすればよいでしょうか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-19 16:52:13319ブラウズ

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 メソッドでは新しい型パラメータを導入できないため、回避策の 1 つは 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 で簡単な作業ではないことを強調しています。 。代替アプローチとしては、次のものが考えられます。

  • 継承の使用: 各型が特定の関数のメソッドを実装する継承階層を設計します。
  • 次のインターフェイスを使用します。明示的なメソッドの実装: ジェネリック型を受け入れる明示的に実装されたメソッドを持つインターフェイスを定義します。引数。

以上がジェネリックスを使用して、Haskell の「fmap」を Go で効果的にエミュレートするにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。