2 回答

TA貢獻1876條經驗 獲得超5個贊
Go 的泛型和方法的組合不像 Haskell 的類型類那樣富有表現力;至少還沒有。特別是,正如 kostix 在他的評論中指出的那樣,
Go 允許泛型類型具有方法,但是除了接收者之外,這些方法的參數不能使用參數化類型。
(來源)
由于 Go 方法不能引入新的類型參數,因此B
在您的方法中訪問的唯一方法是像您所做的那樣在您的類型fmap
聲明中引入它。Functor
但這沒有意義,因為根據類別理論,函子采用一個類型參數,而不是兩個。
這個例子可能足以讓您相信,在 Go 中使用泛型和方法來模擬 Haskell 類型類是徒勞的。
不過,您可以做的一件事是 implement fmap
,不是作為方法,而是作為頂級函數:
package main
import "fmt"
type S[A any] struct {
contents A
}
func Fmap[A, B any](sa S[A], f func(A) B) S[B] {
return S[B]{contents: f(sa.contents)}
}
func main() {
ss := S[string]{"foo"}
f := func(s string) int { return len(s) }
fmt.Println(Fmap(ss, f)) // {3}
}
但僅僅因為你可以并不意味著你應該??偸菃枂栕约?,將一種方法從其他語言轉移到 Go 是否感覺正確。

TA貢獻1803條經驗 獲得超3個贊
我要補充一點,您遇到的一些問題是您從錯誤的定義開始。提議中應該有一些直接的危險信號Functor——
type Functor [A any, B any] interface{
// ^ Functor should wrap a single type ??
fmap(f func(A)B) B
// ^ should return Functor-wrapped B ??
}
解決你上面的問題,這就是我們想寫的 -
type Functor[A any] interface{
fmap[B any](f func(A)B) Functor[B]
}
然而,Go 警告我們就您面臨的問題向我們提供直接反饋 -
interface method must have no type parameters
undefined: B
正如 @jub0bs 在鏈接的答案中指出的那樣,方法可能不會采用額外的類型參數。
- 2 回答
- 0 關注
- 105 瀏覽
添加回答
舉報