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:
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!