在Go 中模擬Haskell 的fmap
在Go 中模擬Haskell 類型類別時,無法讓方法參數使用參數化類型是一個挑戰。考慮以下嘗試模擬 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 }
由於介面實作中未定義類型 B,此程式碼失敗。
使用頂層函數的解決方法
由於 Go 方法無法引入新的類型參數,解決方法是將 fmap實作為頂級function:
func Fmap[A, B any](sa S[A], f func(A) B) S[B] { return S[B]{contents: f(sa.contents)} }
替代方法
雖然此解決方法解決了眼前的問題,但它強調使用泛型和方法模擬Haskell 類型類在Go 中並不是一件簡單的事。替代方法可能包括:
以上是如何使用泛型在 Go 中有效模擬 Haskell 的「fmap」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!