Предоставить другое тело функции для универсальной функции на основе типа

Предположим, у меня есть некоторая универсальная функция

genericFunc :: a -> b
genericFunc x = doSomeHardWork

Но для конкретного типа существует гораздо более эффективный способ выполнения genericFunc .

genericFunc :: ParticularType -> b
genericFunc x = doSomeEasyWork

Как лучше всего объединить эти два функциональных тела в один и тот же genericFunc , чтобы при использовании в ParticularType он выполнял SomeEasyWork , но когда используется с другими типами, он будет делать SomeHardWork ? Я специально исключаю возможность использования другого имени или разных модулей.

Я считаю, что это можно сделать с помощью класса типов, но меня больше интересуют решения, использующие прагмы языка. У меня есть смутное подозрение, что это можно сделать с помощью языковых прагм, но я не знаю, как это сделать. Бонусные баллы, если вы сравните и сопоставите эти подходы и / или любые другие возможные подходы.

5
задан Dan Burton 11 December 2011 в 20:57
поделиться