我想fmap在 Go 中進行模擬。一個簡單的例子:
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
}
這失敗了:undefined: B關于interface實施。有沒有常見的解決方法?
uj5u.com熱心網友回復:
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 是否感覺正確。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/483533.html
上一篇:WSL2Nginx PHPFPM在連接到上游時失敗(111:連接被拒絕),客戶端:172.23.0.1,上游:“fastcgi://172.23.0.3:9001”
