Modular implicits – a system for ad-hoc polymorphism in OCaml