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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-12-15 11:22:09392ブラウズ

How Can I Effectively Emulate Haskell's `fmap` in Go Using Generics?

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

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