package main import "fmt" type Left[A any] struct{ value A } type Right[B any] struct{ value B } func match[A any, B any, R any](val any, l func(A) R, r func(B) R) R { switch val := val.(type) { case Left[A]: return l(val.value) case Right[B]: return r(val.value) } panic("match: type error") } func main() { fmt.Println(match(Right[string]{"lol"}, func(x string) string { return "" }, func(x string) string { return x })) }