No doubt it is the closest, and perhaps it is the only possible approach! In Haskell you can’t even have the same field names between types.
I agree. If people don’t use the same operators (or function names) as other packages (or base) and use a largely disjoint set of operators from others, then it works great. The question is how sustainable that it with lots of packages, how teachable it is to people who have fragiliity in their own method name choices when things break as they decide to use a new package, and whether it is basically encouraging people to move towards C
style names for everything (i.e. the obvious permutation to avoid future and current namespace clashes with a function is to just put the name of the package into function, making namespaces somewhat pointless).
Maybe this is as good as it can get with a programming language with first-class functions, but I would keep your mind open that there could be a better (and largely backwards compatible) way in the future by looking to what over languages have done.
Anyways, this has been done to death at this point. One of my goals was the hope that people would understand that these namespace issues are not inherent to multiple-dispatch, but a consequence of design decisions in Julia (and, possibly, design decisions where there are no foreseeable alternatives). But it is not a case of “with ADL you can’t do generic programming correctly”. In fact, ADL was created precisely to enable generic programming with namespaces and operators.