亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Go 中模擬 `fmap`?

如何在 Go 中模擬 `fmap`?

Go
慕后森 2022-12-19 11:55:38
我想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實施。有沒有通用的解決方法?
查看完整描述

2 回答

?
慕運維8079593

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 是否感覺正確。



查看完整回答
反對 回復 2022-12-19
?
繁星點點滴滴

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 在鏈接的答案中指出的那樣,方法可能不會采用額外的類型參數。



查看完整回答
反對 回復 2022-12-19
  • 2 回答
  • 0 關注
  • 105 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號