Golang 泛型 + 可变参数函数

Golang Generic+Variadic Function

提问人:404 提问时间:7/3/2023 更新时间:7/3/2023 访问量:200

问:

在 Golang 中具有一些通用类型的许多函数

type Transformer[A, B any] func(A)(B, error)

如何定义一个通用可调参数高阶函数,该函数通常可以组成这样的函数

func Compose[A,B,C....N any](transformers... Transformer[A,B], Transformer[B,C]...Transformer[M,N]) Transformer[A,N]
go 泛型可 变参数

评论

0赞 Volker 7/3/2023
1. 你不能那样做, 2.因为它没有意义和 3.不需要,因为您只需要三种类型的 Compose。(另外,该语言的名称是 Go。使用Lean或Coq或类似的东西,如果你不想在功能和类型系统上发疯)。

答:

2赞 NubDev 7/3/2023 #1

在 Go 中,尚不支持泛型可变参数函数。但是,您可以通过使用可变参数和递归来实现类似的结果。

评论

0赞 404 7/23/2023
是的,我最终得到了一步迭代编辑器type Composer[A,B, C any] func(ab Transformer[A, B], bc Transformer[B, C]) C
0赞 Spencer Connaughton 7/3/2023 #2

我同意@Volker;这在围棋中是一件愚蠢的事情。我建议你发布另一个问题,总结一下你实际上试图用这种结构解决的问题,看看是否有办法解决你的问题,这更习惯。

话虽如此,只是为了好玩:

package main

import (
    "fmt"
)

type Composable[B, N any] func(in B) N

func Return[N any]() Composable[N, N] {
    return func(in N) N {
        return in
    }
}

func ToString[N any](next Composable[string, N]) Composable[int, N] {
    return func(in int) N {
        return next(fmt.Sprintf("%v", in))
    }
}

func Hello[N any](next Composable[string, N]) Composable[string, N] {
    return func(in string) N {
        return next(fmt.Sprintf("helloooo %s", in))
    }
}

func main() {
    f := ToString(Hello(Return[string]()))
    res := f(22)
    fmt.Printf("%v", res)
    // Output: helloooo 22
}

需要明确的是,如果我在代码审查中看到这一点,我会非常担心。 😝