Heim >Backend-Entwicklung >Golang >Wie kann Haskells „fmap' mithilfe von Generics in Go effektiv emuliert werden?

Wie kann Haskells „fmap' mithilfe von Generics in Go effektiv emuliert werden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-19 16:52:13318Durchsuche

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

Emulieren von Haskells fmap in Go

Die Unmöglichkeit, dass Methodenargumente parametrisierte Typen verwenden, stellt eine Herausforderung bei der Emulation von Haskell-Typklassen in Go dar. Betrachten Sie das folgende Beispiel, in dem versucht wird, fmap zu emulieren:

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
}

Dieser Code schlägt aufgrund des undefinierten Typs B in der Schnittstellenimplementierung fehl.

Problemumgehung mithilfe einer Top-Level-Funktion

Da Go-Methoden keine neuen Typparameter einführen können, besteht eine Problemumgehung darin, fmap als oberste Ebene zu implementieren Funktion:

func Fmap[A, B any](sa S[A], f func(A) B) S[B] {
    return S[B]{contents: f(sa.contents)}
}

Alternative Ansätze

Während dieser Workaround das unmittelbare Problem löst, unterstreicht er, dass die Emulation von Haskell-Typklassen mithilfe von Generika und Methoden in Go kein einfaches Unterfangen ist . Alternative Ansätze könnten umfassen:

  • Vererbung verwenden:Entwerfen Sie eine Vererbungshierarchie, in der jeder Typ eine Methode für eine bestimmte Funktion implementiert.
  • Verwendung von Schnittstellen mit explizite Methodenimplementierungen: Definieren Sie Schnittstellen mit explizit implementierten Methoden, die generische Typen akzeptieren als Argumente.

Das obige ist der detaillierte Inhalt vonWie kann Haskells „fmap' mithilfe von Generics in Go effektiv emuliert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn