Это, безусловно, не имеет никакого отношения к экземплярам категории.
Экземпляр Semigroup
требует, по крайней мере, концептуально, также Ord
, однако вы уже упаковали это в GADT (за исключениемслучай Id
, где он не нужен, потому что он тривиален), поэтому нет необходимости упоминать ограничение в заголовке экземпляра.
Для mempty
однако у вас нет значение RelationMS
под рукой, из которого вы могли бы прочитать ограничения (Ord a, Ord b)
.Скорее наоборот: вам нужно предоставить эти ограничения, потому что вы сейчас пытаетесь свернуть такой GADT!Вот почему экземпляр Monoid
нуждается в ограничении в своей голове, а экземпляр Semigroup
- нет.