В Num операция сложения (+) имеет сигнатуру
(+) :: a->a->a
Т.е. тип аргументов и результата — один и тот же.
Но как тогда складывать разные реализации Num ? В этом классы хаскеля совсем не похожи на интерфейсы.
Меня бы больше устроило так:
(+) :: (Num a, Num b, Num c) => a->b->c
Но тогда в какой класс помещать такое сложение ?