Ну вот есть какие-нибудь два тайп класса. Компилятор может спросить у типа, работает ли этот тип с каким-то из них или даже с обоими сразу, и получить ответ "да"/"нет"
А если работает, то компилятор позволяет дергать методы, идущие с тайп классом и передавать им этот кастомный тип (на деле наоборот, но упрощая можно и так сказать)
Они превращаются в мапу конкретных методов и передаются в виде структур в клиентские функции, так что да. Но это уже в рантайме, когда компилятор все задачки на предикаты решил
Хаскель не тотальный? А какие примеры есть тотальных языков? Да и вообще, почему дата одних структур не может быть одновременно кодатой других? order.invoice(...) - кодата ордера, но и одновременно дата для инвойса