Haskell などのさまざまなプログラミング言語において、fmap は、型を保持しながらデータ構造に関数を適用するための貴重なツールです。ただし、Go で fmap と直接同等のものを実装するには、メソッドベースのジェネリックスがあるため、独特の課題が生じます。疑問が生じます: タイプ セーフを損なうことなく、Go で fmap 機能をエミュレートするにはどうすればよいでしょうか?
Go ジェネリクスの制限
残念ながら、Go の現在のジェネリック システムはうまく機能しませんメソッドを介して fmap を直接エミュレートします。メソッド パラメーターに新しい型パラメーターを導入できないため、質問で述べた型不一致エラーが発生します。
代替アプローチ
同様のメソッド アプローチを使用したくなるかもしれませんが、 Haskell にとって、次の考慮事項は、より賢明な代替案につながります:
fmap の実装トップレベル関数として
Go で 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 言語に固有の制限を考慮することが重要です。 fmap をエミュレートするためのより慣用的な Go ベースのアプローチを採用することで、Go の設計原則を守りながら、目的の機能を実現できます。
以上が型安全性を維持しながら、Go で fmap 機能をエミュレートするにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。