Ad hoc polymorphism and usability

I could use the same argument about any abstraction or module interface. What is the implementation actually being used? Any language feature requires experience to apply it appropriately. As someone with Haskell and OCaml experience, I can say that ad-hoc overloading can make code much easier to both read and write. In Haskell, to map over anything it’s just “fmap”, to show anything it’s just “show”, or for equality it’s (==).

Modular implicits and type-classes also offer “type-derived” code. For example, one can just use (==) on lists and the correct equality is derived from the underlying types, no additional comparison arguments need to be threaded everywhere. Similarly for fmap.