Это похоже на ответ Даниэля Пратта, но более типичный подход состоит в том, чтобы исключить ограничения типов в определении данных, например:
data SomeData a = SomeValue
| SomeConstructor a
Вместо этого вы должны наложить ограничение (Integral a)
на все функции, которые в нем нуждаются, что вам придется делать, даже если вы добавили ограничение и в определение данных. Установив ограничение на определение данных, вы ничего не покупаете, но вынуждаете обойти ограничение на все случаи использования SomeData
, даже те, которые не заботятся о том, что такое a
. См. Глава 10 Реального мира Haskell для получения дополнительной информации.