Ответ 1
На самом деле, вещи в основном просто просты в Haskell: классы типов обычно называются на основе того, что представляют собой операции, а не того, что представляет собой параметр типа.
Например:
-
Read
,Show
: классы типов, для которых определены стандартные функции сериализации/десериализации строк. -
Eq
,Ord
: классы типов, для которых определены отношения равенства и упорядочения соответственно. -
Enum
: класс типов, определяющий операцию "преемника", т.е. значения которых могут быть перечислены. -
Monoid
,Functor
,Monad
: классы типов, которые определяют операции, связанные с аналогично названными математическими структурами.
Некоторые примеры не так хороши: например, Num
- это класс типов, для которых определен ad-hoc-набор неопределенно-арифметико-ориентированных операций, но нет причин, чтобы экземпляр Num
должно фактически быть числом в любом обычном смысле. Возможно, это можно было бы перенаправить как "типы, поддерживающие числовые операции", притворяясь, что "числовой" фактически означает что-либо в этой фразе.
Короче говоря, Numeric
, вероятно, является плохим примером для подражания, и если класс типа имеет только одну функцию (возможно, с несколькими вариантами), почти всегда можно назвать класс после этой функции, как в случае Show
против Show
.
Но на самом деле главное - думать в терминах функций класса type, а не параметра типа. Подумайте, глаголы, а не существительные. Существительные - все равно глупые инертные вещи, поэтому мышление с точки зрения действий и операций, вероятно, приведет к улучшению дизайна программы.