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 サイトの他の関連記事を参照してください。