There's nothing that prevents me from implementing all of
plus(Int, Int) plus(Int, Vec) plus(Int, Mat) plus(Vec, Vec) plus(Vec, Mat) plus(Mat, Mat)
You want every operation to have a distinctly named version for each other numeric type?
Maybe you can reduce some of those, but you can't really have interfaces without some overloading.
There's nothing that prevents me from implementing all of
and to know which `plus` is being dispatched, you need to know the types of both arguments, exactly the same as if `plus` is named `__add__` in python or `operator+` in C++.