Maison >développement back-end >Golang >Comment puis-je émuler efficacement le « fmap » de Haskell dans Go en utilisant des génériques ?

Comment puis-je émuler efficacement le « fmap » de Haskell dans Go en utilisant des génériques ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-15 11:22:09389parcourir

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

Émulation de fmap dans Go

En essayant d'émuler le comportement de mappage fonctionnel de fmap dans Go à l'aide de génériques et de méthodes, les développeurs peuvent rencontrer un type problème d'inférence où l'implémentation ne peut pas accéder à un type générique défini dans l'interface. Cette erreur provient de la limitation des méthodes Go à utiliser des types paramétrés comme arguments au-delà du type récepteur.

Pour résoudre cette contrainte, la solution de contournement courante consiste à implémenter fmap en tant que fonction de niveau supérieur plutôt qu'en tant que méthode. En déclarant fmap en dehors de la définition de type, il accède aux types génériques nécessaires, permettant une fonctionnalité de mappage appropriée.

Considérez l'exemple suivant :

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}
}

Cette approche adhère au type de Go. système tout en fournissant la fonctionnalité de cartographie souhaitée, bien que via une stratégie de mise en œuvre différente. Cependant, il est crucial de considérer la pertinence de traduire les concepts d'autres langues vers Go d'une manière qui semble naturelle au sein de l'écosystème Go.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn