You're basically telling the compiler to generate new versions of the same function, or struct, or whatever. The mental challenge with just adding type parameters is that you're thinking of the type as generic, which creates "what colour is my code" distinctions; either types are generic or they're not.
I had another syntax in mind that would reuse the "for" keyword:
for type T:
func Max(a, b T) T {
...
}
Both syntaxes work fine for other declarations; structs and methods, for example: for type T:
type Atomic struct {
v T
}
for type T:
func (a *Atomic) Get() T {
...
}
Of course, you still need some syntax to specify types in expressions, but that's also solvable.