Тип Comparison
- это просто newtype
сверх a -> a -> Ordering
.
Ordering
- это экземпляр Semigroup
, определенный, я думаю, в GHC.Base
.
Другой релевантный экземпляр Semigroup
:
Semigroup b => Semigroup (a -> b)
То есть любой тип функции a -> b
имеет экземпляр Semigroup
, если b
имеет экземпляр Semigroup
.
Вы можете думать о a -> a -> Ordering
как о a -> (a -> Ordering)
, то есть о функции, которая принимает a
в качестве ввода и возвращает (a -> Ordering)
в качестве вывода. Поскольку (a -> Ordering)
является экземпляром Semigroup
, то a -> (a -> Ordering)
тоже.
То же самое относится и к Monoid
.
Наконец, как Чи написал в другой ответ , GeneralizedNewtypeDeriving
позаботится об остальном.