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
Mary-Kate Olsenoriginal
2024-12-19 16:52:13315parcourir

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
}

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

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!

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