Maison > développement back-end > Golang > Comment le « fmap » de Haskell peut-il être efficacement émulé dans Go à l'aide de génériques ?

Comment le « fmap » de Haskell peut-il être efficacement émulé dans Go à l'aide de génériques ?

Mary-Kate Olsen
Libérer: 2024-12-19 16:52:13
original
314 Les gens l'ont consulté

How Can Haskell's `fmap` Be Effectively Emulated in Go Using Generics?

Émulation du fmap de Haskell dans Go

L'incapacité d'avoir des arguments de méthode utilisant des types paramétrés présente un défi lors de l'émulation de classes de types Haskell dans Go. Prenons l'exemple suivant qui tente d'émuler 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
}
Copier après la connexion

Ce code échoue en raison du type B non défini dans l'implémentation de l'interface.

Solution de contournement utilisant une fonction de niveau supérieur

Étant donné que les méthodes Go ne peuvent pas introduire de nouveaux paramètres de type, une solution de contournement consiste à implémenter fmap en tant que paramètre de niveau supérieur. function :

func Fmap[A, B any](sa S[A], f func(A) B) S[B] {
    return S[B]{contents: f(sa.contents)}
}
Copier après la connexion

Approches alternatives

Bien que cette solution de contournement résolve le problème immédiat, elle souligne que l'émulation des classes de types Haskell à l'aide de génériques et de méthodes n'est pas une entreprise simple dans Go . Des approches alternatives pourraient impliquer :

  • Utiliser l'héritage : Concevoir une hiérarchie d'héritage dans laquelle chaque type implémente une méthode pour une fonction spécifique.
  • Utiliser des interfaces avec Implémentations de méthodes explicites : Définissez des interfaces avec des méthodes explicitement implémentées qui acceptent des types génériques comme arguments.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal