2 回答

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