Can you please clarify which feature of the language you have a problem with? The ability to write methods
- for functions defined in another module,
- for functions and types defined in other modules (not necessarily the same),
- for functions and types, all defined in the same module,
- that overwrite existing methods, defined in another module?
Guidelines about type piracy are not formally enforced by the language, but catch (2) and (3), and also (4) if the other definition that would be overwritten avoids type piracy. OTOH, restricting (1) would kill a very useful feature.