Предположим, у меня есть некоторая универсальная функция
genericFunc :: a -> b
genericFunc x = doSomeHardWork
Но для конкретного типа существует гораздо более эффективный способ выполнения genericFunc
.
genericFunc :: ParticularType -> b
genericFunc x = doSomeEasyWork
Как лучше всего объединить эти два функциональных тела в один и тот же genericFunc
, чтобы при использовании в ParticularType
он выполнял SomeEasyWork
, но когда используется с другими типами, он будет делать SomeHardWork
? Я специально исключаю возможность использования другого имени или разных модулей.
Я считаю, что это можно сделать с помощью класса типов, но меня больше интересуют решения, использующие прагмы языка. У меня есть смутное подозрение, что это можно сделать с помощью языковых прагм, но я не знаю, как это сделать. Бонусные баллы, если вы сравните и сопоставите эти подходы и / или любые другие возможные подходы.