2 回答

TA貢獻(xiàn)1719條經(jīng)驗 獲得超6個贊
使用切片
https://play.golang.org/p/DrEnGkIEbU3
package main
import (
"fmt"
)
func main() {
fmt.Println(v(v(v(0))))
fmt.Println(compose(v, v, v)(0))
}
func v(i int) int {
return i + 1
}
func compose(manyv ...func(int) int) func(int) int {
return func(i int) int {
for _, v := range manyv {
i = v(i)
}
return i
}
}

TA貢獻(xiàn)1821條經(jīng)驗 獲得超6個贊
自 Go 1.18 引入泛型以來,您可以定義以下泛型函數(shù)來組合兩個任意函數(shù):
func compose[A any, B any, C any](f func(A) B, g func(B) C) func(A) C {
return func(a A) C {
return g(f(a))
}
}
上面的組合順序compose是從左到右,即compose(f, g)返回函數(shù)“ f后的g ”或g°f,相當(dāng)于Haskell中的以及F#或Elm中的to 。g . ff >> g
換句話說,結(jié)果函數(shù)的輸入 – compose(f, g)– 被饋送到f,然后f的輸出被饋送到g,其輸出是最終結(jié)果:
讓我們首先定義Adapter用于表示要編寫的函數(shù)類型的類型:
type Adapter = func(*Handle) *Handle
使用composeand Adapter,您現(xiàn)在可以定義composeAdapters組合任意數(shù)量的這些Adapter函數(shù):
func composeAdapters(adapters ...Adapter) Adapter {
composition := func(h *Handle) *Handle {
return h
}
for _, adapter := range adapters {
composition = compose(composition, adapter)
}
return composition
}
請注意 被composition初始化為 的恒等函數(shù)*Handle。您可以將其視為無操作適配器:它只是將生成的組合適配器的輸入轉(zhuǎn)發(fā)到鏈中要組合的第一個函數(shù)(如果有)。這也意味著composeAdapters不帶任何參數(shù)的調(diào)用(例如,composeAdapters())會導(dǎo)致無操作適配器:它對輸入不執(zhí)行任何操作*Handle;它只是將其返回。
給定類型的函數(shù)f、g和–即–可以實現(xiàn)為:hAdapterfunc(*Handle) *HandleapplyMiddleware
var applyMiddleware = composeAdapters(f, g, h)
再次注意組合順序:
- 2 回答
- 0 關(guān)注
- 155 瀏覽
添加回答
舉報