Go での fmap のエミュレーション
開発者は、ジェネリックスとメソッドを使用して Go で fmap の関数マッピング動作をエミュレートしようとしているときに、型に遭遇する可能性があります。実装がインターフェイスで定義されたジェネリック型にアクセスできないという推論の問題。このエラーは、レシーバーの型を超えた引数としてパラメーター化された型を使用する場合の Go メソッドの制限に起因します。
この制約に対処するための一般的な回避策は、fmap をメソッドではなくトップレベル関数として実装することです。 fmap を型定義の外で宣言することで、必要なジェネリック型にアクセスできるようになり、適切なマッピング機能が可能になります。
次の例を考えてみましょう。
package main import "fmt" type S[A any] struct { contents A } func Fmap[A, B any](sa S[A], f func(A) B) S[B] { return S[B]{contents: f(sa.contents)} } func main() { ss := S[string]{"foo"} f := func(s string) int { return len(s) } fmt.Println(Fmap(ss, f)) // {3} }
このアプローチは Go の型に準拠しています。異なる実装戦略を通じてでも、必要なマッピング機能を引き続き提供しながら、システムにアクセスできます。ただし、Go エコシステム内で自然に感じられる方法で、他の言語の概念を Go に翻訳することが適切であるかを考慮することが重要です。
以上がジェネリックスを使用して Go で Haskell の「fmap」を効果的にエミュレートするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。