Где определяется экземпляр Monoid в Сравнении? - PullRequest
0 голосов
/ 03 января 2019

newtype Comparison a определяется в Data.Functor.Contravariant.

В версии этого модуля, определенной в contravariant-1.5, экземпляр Monoid включен Contravariant определяется следующим образом:

instance Monoid (Comparison a) where
  mempty = Comparison (\_ _ -> EQ)
  mappend (Comparison p) (Comparison q) = Comparison $ mappend p q

Data.Functor.Contravariant также определяется в базе (по-видимому, в GHC 8.6.1).В базе экземпляр Monoid в Comparison определяется следующим образом :

deriving instance Semigroup (Comparison a)
deriving instance Monoid (Comparison a)

Что позволяет автоматически извлекать экземпляр для Monoid (Comparison a) в базе?

А где мне посмотреть определения mempty и mappend для него?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Тип 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 позаботится об остальном.

0 голосов
/ 03 января 2019

Для newtype с при включенном GeneralizedNewtypeDeriving экземпляр получается с использованием экземпляра базового типа.

Итак, используется mempty @ a -> a -> Ordering (то же самое для mappend), а затемперематывается как mappend :: Comparison a.

Обратите внимание, что в конечном итоге это включает экземпляры полугруппы / моноиды для типов функций b -> c и экземпляры для Ordering.

...