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 关注
- 127 浏览
添加回答
举报