第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Go:自己的 List 類型與自己的 Functor 類型不兼容

Go:自己的 List 類型與自己的 Functor 類型不兼容

Go
慕妹3146593 2023-01-03 11:26:20
為了更多地了解Go、泛型和函數(shù)式編程,我實(shí)現(xiàn)了一個(gè)List類型(摘自list.go):package funcprogtype Function[T any] func(T) Ttype List[T any] []Tfunc (l List[T]) Map(f Function[T]) List[T] {    var ys List[T]    for _, x := range l {        y := f(x)        ys = append(ys, y)    }    return ys}效果很好(main.go):package mainimport (    "fmt"    "funcprog")func main() {    numbers := funcprog.List[int]{0, 1, 2, 3}    twice := func(x int) int { return x * 2 }    fmt.Println(numbers.Map(twice))}$ go run main.go[0 2 4 6]我List的其實(shí)是一個(gè)Functor,所以我寫了這個(gè)接口(functor.go):package funcprogtype Functor[T any] interface {    Map(Function[T]) Functor[T]}但是,如果我想將我List的用作Functor( main.go,已修改):import (    "fmt"    "funcprog")func demo[T int](f funcprog.Functor[T]) {    fmt.Println(f.Map(func(x T) T { return x * 2 }))}func main() {    numbers := funcprog.List[int]{0, 1, 2, 3}    demo[int](numbers)}我收到此錯(cuò)誤:funcprog.List[int] does not implement funcprog.Functor[int] (wrong type for Map method)    have Map(f funcprog.Function[int]) funcprog.List[int]    want Map(funcprog.Function[int]) funcprog.Functor[int]我的不List[int]也是一個(gè)Functor[int],因?yàn)長ist[T]滿足Functor[T]嗎?
查看完整描述

2 回答

?
UYOU

TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊

當(dāng)查看一個(gè)類型是否實(shí)現(xiàn)了一個(gè)接口時(shí),go 不會(huì)嘗試對該函數(shù)簽名的元素進(jìn)行“接口映射”,它只會(huì)比較確切的簽名。


如果你想讓你的List[T]類型實(shí)現(xiàn)你的Functor[T]接口,你應(yīng)該改變Map()方法的簽名:


func (l List[T]) Map(f Function[T]) Functor[T] {

    ...

}

額外提一點(diǎn):這與泛型無關(guān),而是與如何在接口上實(shí)現(xiàn)類型檢查有關(guān)。


這是另一個(gè)例子(沒有泛型):


type MyStr string


// MyStr implements fmt.Stringer

func (s MyStr) String() string {

    return string(s)

}


// but this method does not fulfill the Concatter interface below

func (s MyStr) Concat(x string) MyStr {

    return s + " " + MyStr(x)

}


type Concatter interface {

    Concat(s string) fmt.Stringer

}


var _ Concatter = MyStr("") // compilation error

https://go.dev/play/p/tKDGEXlYHyl


查看完整回答
反對 回復(fù) 2023-01-03
?
慕絲7291255

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊

函數(shù)簽名中的類型必須完全匹配。所以你只需要改變List.Map方法的返回類型來返回一個(gè)Functor[T].

func (l List[T]) Map(f Function[T]) Functor[T]

現(xiàn)在可以編譯了,因?yàn)?code>List[T]確實(shí)用它自己的方法實(shí)現(xiàn) ,并且實(shí)例化 和共享相同的具體類型。Functor[T]MapdemoList

固定游樂場:https ://go.dev/play/p/a4GeqXstjct

我的List[int]不也是Functor[int]嗎,因?yàn)長ist[T]滿足Functor[T]?

是的,但是 Go generics不支持任何形式的 type variance,因此List[T]在您的示例中返回方法簽名不同于接口的方法簽名。


查看完整回答
反對 回復(fù) 2023-01-03
  • 2 回答
  • 0 關(guān)注
  • 148 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號